leetcode筆記之陣列

2021-08-19 15:29:41 字數 3304 閱讀 8653

陣列要注意越界問題

一般轉化為有序,但是如果是返回位置而不是數的集合,就要用到hashtable

1.兩數之和(陣列無序,返回位置)

1.申請乙個hash_table

unordered_maphash;

2.遍歷陣列,令num = target - nums[i];

2.1.如果num已經在hash_map中了,那就返回hash[num]和i

2.2.否則把nums[i]-i存在hash_map

for (int i = 0; i < nums.size(); i++) ;

hash[nums[i]] = i;

}return result;

167. 兩數之和 ii - 輸入有序陣列
while(i//雙向遍歷

; if(numbers[i]+numbers[j] < target) ++i;

if(numbers[i]+numbers[j] > target) --j;

}

15. 三數之和(陣列無序,返回元素)
sort(nums.begin(), nums.end());//1.排序

for (int i = 0; i < n - 2; ++i)//2. 0-n-3遍歷

);//就把其放入v

//然後跳過重複值

while(nums[i] == nums[i + 1]) ++i;

while(nums[l] == nums[l+1]) ++l;

while(nums[r] == nums[r-1]) --r;

//移動

--r;++l;

}else

if (nums[i] + nums[l] + nums[r] < 0) ++l; ++l

else --r; --r

}}return v;

18.四數之和(陣列無序,返回元素)
sort(nums.begin(), nums.end());//1.排序

for (int i = 0; i < n - 3; i ++) //2.確定第1個值

); 跳到最左/右邊的重複值

while (nums[i] == nums[i + 1]) ++i;

while (nums[j] == nums[j + 1]) ++j;

while (nums[l] == nums[l + 1]) ++l;

while (nums[r] == nums[r - 1]) --r;

++l;

--r;

} else

if (nums[i] + nums[j] + nums[l] + nums[r] < target) sum < targe,l右移

l++;

else r--; sum > targer,左移}}

}return v;

16. 最接近的三數之和
sort(nums.begin(),nums.end());//1.先排序

int min_dif=int_max,dif;

for(int i =0;i1;++i)

//移動

if(dif<0) j++;

if(dif>0) k--;

if(dif==0) return res;

}}return res;

39. 組合總和

給定乙個無重複元素的陣列 candidates 和乙個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。

candidates 中的數字可以無限制重複被選取

vector

> combinationsum(vector

&candidates, int target)

void combinationsum(vector

& candidates, int target, vector

>& v, vector

& tmp, int begin)

//每一層都有乙個for,以此來找最終符合target==0條件的tmp

for (int i = begin; i != candidates.size() && target >= candidates[i]; ++i) //從begin開始遍歷

}

40. 組合總和 ii

給定乙個陣列 candidates 和乙個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。

candidates 中的每個數字在每個組合中只能使用一次

vector

> combinationsum2(vector

& candidates, int target)

void solver(vector

& candidates, int target, vector

>& v, vector

& tmp, int beg)

for (int i=beg; i//4.每一遞迴層,滿足candidates[i]<=target,則繼續for遍歷

}

216. 組合總和 iii

找出所有相加之和為 n 的 k 個數的組合。組合中只允許含有1 - 9的正整數,並且每種組合中不存在重複的數字。

注:0~9中k個數和為n,就是在 組合總和ii 的基礎上,

限制了0vector

> combinationsum3(int k, int n)

void help(int k, int target, vector

>& v, vector

& tmp, int beg)

for (int i = beg; i < 10 && i<=target; i++) <=target

}216. 組合總和 ⅳ

給定乙個由正整數組成且不存在重複數字的陣列,找出和為給定目標正整數的組合的個數。

53. 最大子序和(動態規劃)

dp[i]:以i為最後乙個元素,最大 連續子陣列和:dp[i] = nums[i] + max(dp[i - 1] , 0 );,可以看出只要maxsum>0,他就是有價值的。

「`cpp

int maxsubarray(vector& nums)

return maxsum;

}

LeetCode筆記 陣列(2)

給定乙個排序好的陣列,在原始陣列中刪除掉重複的元素,使得每個元素只出現一次,返回最終陣列的長度。問題記錄 1.sorted sorted sorted 重要的事情說三遍!審題一定要認真,拿到題目忽略了這個條件,浪費了大部分時間在這上面。其實題目給的陣列都是排序好的,也就是說,重複的元素都是在相鄰位置...

LeetCode筆記 陣列(4)

給定乙個32位的有符號整數,實現數字反轉。這道題用的是字串反轉的方法,但是用整數求餘的方法可能會方便許多。思路大致如下 將整數轉化成字串,再用 0 0 1 的切片方法進行反序,最後再將反序後的字串轉換成整數。其中,要考慮兩個問題。一是整數末尾有0,應將其轉換成字串之後把末尾的0去掉。二是當整數是負數...

LeetCode之旋轉陣列

給定乙個陣列,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。示例 1 輸入 1,2,3,4,5,6,7 和 k 3 輸出 5,6,7,1,2,3,4 解釋 向右旋轉 1 步 7,1,2,3,4,5,6 向右旋轉 2 步 6,7,1,2,3,4,5 向右旋轉 3 步 5,6,7,1,2,3,...