中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

4.移動零

image

這(zhe)個簡單就是借一(yi)個temp中間(jian)量來(lai)作互換

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

找到最(zui)(zui)大邊和次(ci)最(zui)(zui)大邊不(bu)難 也就是(shi)它們中(zhong)間包的東西

        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
這兩個條(tiao)件(jian)一點(dian)都不(bu)難 甚至都稱不(bu)上算法

    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);

難就(jiu)難在 如何去掉重(zhong)復(fu)的(de) 例如:

image

我腦子想到過用Set去重 不過并未實現
借助DeepSeek的想法 就是得(de)到三元組后(hou) 排序 然(ran)后(hou)使用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]]
    }
}

只不過時間復雜度高 網(wang)上更(geng)多(duo)的是雙指(zhi)針法 腦子笨就像(xiang)出來這個

image

不過人家沒要求算法的(de)復雜度(du)優化

7.接雨水

image
這道題確實giao 我本身還去找啥規律的湊出來 實際上想法不對
就學習他(ta)人了 兩個方法(fa) 一(yi)個雙指針法(fa) 一(yi)個去(qu)重法(fa)

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

參考官方 就是一個(ge)一個(ge)從左右(you)兩邊(bian)數 然后累加

第二個方法確(que)實牛(niu) 也難想象

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(也就是 右邊一遍柱子+右光影+左一部分光影)
最后(hou)減去左(zuo)邊柱子(zi) 便得到了可乘的雨水

只能說(shuo)算法的(de)世界確實精彩 不僅(jin)要你(ni)邏輯思(si)維(wei)能力(li)其(qi)實也就(jiu)是(shi)(shi)數學能力(li) 還有代碼(ma)的(de)實現 好(hao)(hao)好(hao)(hao)學吧(ba) 就(jiu)是(shi)(shi)個菜鳥

posted on 2025-06-10 10:09  蒸餃  閱讀(14)  評論(0)    收藏  舉報