4.移動零

這(zhe)個簡單就是借一(yi)個temp中間(jian)量來(lai)作互換
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.盛最多水的容器

找到最(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));
大致意思是這樣的
6.三數之和

這個找出來所有符合
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) 例如:
我腦子想到過用Set去重 不過并未實現
借助DeepSeek的想法 就是得(de)到三元組后(hou) 排序 然(ran)后(hou)使用HashSet去重
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)出來這個
不過人家沒要求算法的(de)復雜度(du)優化
7.接雨水

這道題確實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;
}
}
參考官方 就是一個(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;
}
}
我大致理解的就是把 左邊所有的加起來+右邊所有的加起來(實際上就是兩遍柱子+左右光影)然后再減去整個圖形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)個菜鳥








