• 力扣:365. 水壶问题


    知道逻辑是啥,不会写,哈哈哈

    只能CV一下官方代码了,哈哈哈

    1. import java.util.Deque;
    2. import java.util.HashSet;
    3. import java.util.LinkedList;
    4. import java.util.Set;
    5. /**
    6. * @author xnl
    7. * @Description:
    8. * @date: 2022/6/28 22:52
    9. */
    10. public class Solution {
    11. public static void main(String[] args) {
    12. Solution solution = new Solution();
    13. }
    14. public boolean canMeasureWater(int jug1Capacity, int jug2Capacity, int targetCapacity) {
    15. Deque<int[]> stack = new LinkedList<>();
    16. stack.push(new int[]{0 ,0});
    17. Set<Long> seen = new HashSet<>();
    18. while (!stack.isEmpty()){
    19. if (seen.contains(hash(stack.peek()))){
    20. stack.pop();
    21. continue;
    22. }
    23. seen.add(hash(stack.peek()));
    24. int[] state = stack.pop();
    25. // 代表第一个水壶和第二个水壶
    26. int remain_x = state[0], remain_y = state[1];
    27. // 第一个水壶达到了预期值,或者第二个水壶达到了预期值,或者第一个水壶加第二个水壶到达预期值
    28. if (remain_x == targetCapacity || remain_y == targetCapacity || remain_x + remain_y == targetCapacity){
    29. return true;
    30. }
    31. // 把第一个水壶灌满
    32. stack.push(new int[]{jug1Capacity, remain_y});
    33. // 把第二个水壶灌满
    34. stack.push(new int[]{remain_x, jug2Capacity});
    35. // 把第一个水壶倒空
    36. stack.push(new int[]{0, remain_y});
    37. // 把第二个个水壶倒空
    38. stack.push(new int[]{remain_x, 0});
    39. // 把第一个水壶灌进第二个水壶,直到满或者空
    40. stack.push(new int[]{remain_x - Math.min(remain_x, jug2Capacity - remain_y), remain_y + Math.min(remain_x, jug2Capacity - remain_y)});
    41. // 把第二个水壶灌进第一个水壶,直到满或者空
    42. stack.push(new int[]{remain_x + Math.min(remain_y, jug1Capacity - remain_x), remain_y - Math.min(remain_y, jug1Capacity - remain_x)});
    43. }
    44. return false;
    45. }
    46. private long hash(int[] state){
    47. return (long) state[0] * 1000001 + state[1];
    48. }
    49. /**
    50. * 贝祖定理
    51. * @param x
    52. * @param y
    53. * @param z
    54. * @return
    55. */
    56. private boolean canMeasureWater2(int x, int y, int z){
    57. if (x + y < z){
    58. return false;
    59. }
    60. if (x == 0 || y == 0 ){
    61. return z == 0 || x + y == z;
    62. }
    63. return z % gcd(x, y) == 0;
    64. }
    65. private int gcd(int x, int y){
    66. int remainder = x % y;
    67. while (remainder != 0){
    68. x = y;
    69. y = remainder;
    70. remainder = x % y;
    71. }
    72. return y;
    73. }
    74. }

  • 相关阅读:
    使用 Amazon Bedrock 和 RAG 构建 Text2SQL 行业数据查询助手
    TDengine函数大全-时序库特有函数
    【大数据折腾不息系列】(二) Hadoop 3.0 安装
    带你手撕一颗红黑树
    Mybatis多表连接查询——一对多
    【微信自动化】使用c#实现微信自动化
    PyTorch源码学习系列 - 1.初识
    你能猜出这是什么代码
    Redis系列之常见数据类型应用场景
    Web前端系列技术之Web APIs基础(从基础开始)②
  • 原文地址:https://blog.csdn.net/newOneObject/article/details/125512046