4.移动零

image

这个简单就是借一个temp中间量来作互换

image

public class gao {
    public static void main(String[] args) {
        int nums[] = {0, 1, 0, 3, 12};
//        int nums[] = {1, 0, 0, 3, 12,0};
//        int nums[] = {0};
        for (int i = 0; i < nums.length; i++) {
            for (int j = i + 1; j < nums.length; j++) {
                if (nums[i] == 0 && nums[j] != 0) {
                    int temp = nums[i];
                    nums[i] = nums[j];
                    nums[j] = temp;
                }
            }
        }
        for (int num : nums) {
            System.out.print(num + " ");
        }
    }
}

5.盛最多水的容器

image

找到最大边和次最大边不难 也就是它们中间包的东西

        int height[] = {1, 8, 6, 2, 5, 4, 8, 3, 7};
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < height.length; i++) {
            for (int j = i + 1; j < height.length; j++) {
                if (height[i] < height[j]) {
                    break;
                } else {
                    while (height[i] >= height[j]) {
                        map.put(j-i,height[j]);
                        break;
                    }
                }
            }
        }

难的是 得到集合后 如何求出它俩中间(包括它俩)包的总共多少个点
这样可以得到7*7 我的脑袋就到这想不了了
然后借鉴学习

      int maxKey=0;
      //map.ketSet() 方法将获取 Map 集合的所有键名 并存放在一个 Set 集合对象中
      for(int key: map.keySet()){
          if(key>maxKey){
              maxKey=key;
          }
      }
        System.out.println(maxKey*map.get(maxKey));

大致意思是这样的
image

6.三数之和

image
这个找出来所有符合
i != j、i != k 且 j != k
nums[i] + nums[j] + nums[k] == 0
这两个条件一点都不难 甚至都称不上算法

    HashMap<Integer, ArrayList> map = new HashMap<>();
        int a = 0;
        for (int i = 0; i < nums.length; i++) {
            for (int j = i + 1; j < nums.length; j++) {
                for (int k = j + 1; k < nums.length; k++) {
                    if (nums[i] + nums[j] + nums[k] == 0) {
//                        System.out.println(i + " " + j + " " + k);
                        ArrayList<Integer> list = new ArrayList<>();
                        list.add(nums[i]);
                        list.add(nums[j]);
                        list.add(nums[k]);
                        map.put(a, list);
                        a++;
                    }
                }
            }
        }
        System.out.println(map);

难就难在 如何去掉重复的 例如:

image

我脑子想到过用Set去重 不过并未实现
借助DeepSeek的想法 就是得到三元组后 排序 然后使用HashSet去重

image

class zhengjiao {
    public List<List<Integer>> fangfa(int[] nums) {
        // 使用HashSet存储去重的三元组(每个三元组是排序后的List)
        Set<List<Integer>> set = new HashSet<>();
        for (int i = 0; i < nums.length; i++) {
            for (int j = i + 1; j < nums.length; j++) {
                for (int k = j + 1; k < nums.length; k++) {
                    if (nums[i] + nums[j] + nums[k] == 0) {
                        // 创建三元组并排序
                        List<Integer> triplet = Arrays.asList(nums[i], nums[j], nums[k]);
                        Collections.sort(triplet); // 排序,使相同三元组变成相同顺序
                        set.add(triplet); // HashSet自动去重
                    }
                }
            }
        }
        // 将Set转换为List<List<Integer>>输出
        List<List<Integer>> result = new ArrayList<>(set);
        return result; // 输出: [[-1, -1, 2], [-1, 0, 1]]
    }
}

只不过时间复杂度高 网上更多的是双指针法 脑子笨就像出来这个

image

不过人家没要求算法的复杂度优化

7.接雨水

image
这道题确实giao 我本身还去找啥规律的凑出来 实际上想法不对
就学习他人了 两个方法 一个双指针法 一个去重法

class Solution {
    //双指针法
    public int trap(int[] height) {
        int ans = 0;
        int left = 0, right = height.length - 1;
        int leftMax = 0, rightMax = 0;
        while (left < right) {
            leftMax = Math.max(leftMax, height[left]);
            rightMax = Math.max(rightMax, height[right]);
            if (height[left] < height[right]) {
                ans += leftMax - height[left];
                ++left;
            } else {
                ans += rightMax - height[right];
                --right;
            }
        }
        return ans;
    }
}

image

image

参考官方 就是一个一个从左右两边数 然后累加

第二个方法确实牛 也难想象

class Solution2 {
    //去重叠法
    public int trap(int[] height) {
        int l_max = 0, r_max = 0, ans = 0;
        for (int i = 0; i < height.length; i++) {
            l_max = Math.max(l_max, height[i]);
            r_max = Math.max(r_max, height[height.length - i - 1]);
            ans += l_max + r_max - height[i];
        }
        return ans - l_max * height.length;
    }
}

image

我大致理解的就是把 左边所有的加起来+右边所有的加起来(实际上就是两遍柱子+左右光影)然后再减去整个图形3*12(也就是 右边一遍柱子+右光影+左一部分光影)
最后减去左边柱子 便得到了可乘的雨水

只能说算法的世界确实精彩 不仅要你逻辑思维能力其实也就是数学能力 还有代码的实现 好好学吧 就是个菜鸟

posted on 2025-06-10 10:09  蒸饺  阅读(17)  评论(0)    收藏  举报