陣列要注意越界問題
一般轉化為有序,但是如果是返回位置而不是數的集合,就要用到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,...