數組:存放在連續內存空間上的相同數據類型的集合
eg:
數組的下標從0開始,
數組中內存空間的地址是連續的,如上圖100 101 102
LeetCode704
解法1:暴力法
思路:遍歷數組,尋找target,找到的話返回下標,找不到返回-1
classSolution{public:
? ? intsearch(vector& nums,int target){
? ? ? ? for(int i = 0;i < nums.size();i++){
? ? ? ? ? ? if(nums[i] == target)? return i;
? ? ? ? }
? ? ? ? return -1;
? ? }
};
解法2:二分法
思路:需注意循環不變量原則,定義好需要查找的空間,每次查找時都遵循這個空間進行。
有兩種空間定義方法:[left,right],[left,right)
[left,right]:查找的范圍在left-right(包含left,right)
所以當nums[left] > tar時,mid = right - 1
[left,right):查找的范圍在left-right(包含left,不包含right)
所以當nums[left] > tar時,mid = right?
程序:
classSolution{public:
? ? intsearch(vector& nums,inttarget){
? ? ? ? //左閉右閉? ? ? ??
????????int left = 0;
? ? ? ? int right = nums.size() - 1;
? ? ? ? while(left <= right){
? ? ? ? ? ? int mid = left + (right - left) / 2;
? ? ? ? ? ? if(nums[mid] > target){
? ? ? ? ? ? ? ? right = mid - 1;? ? ? ? ? ? ? ?
? ? ? ? ? ? }
? ? ? ? ? ? else if(nums[mid] < target){
? ? ? ? ? ? ? ? left = mid + 1;
? ? ? ? ? ? }
? ? ? ? ? ? else if(nums[mid] == target){
? ? ? ? ? ? ? ? return mid;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return -1;
? ? }
};
思路:雙指針法的典型應用
fastIndex用于遍歷數組,尋找到滿足條件的值后使用slowIndex更新,最后更改數組大小
程序:
class?Solution?{
public:
????int?removeElement(vector<int>&?nums,?int?val)?{
????????int?slowIndex?=?0;
????????int?fastIndex?=?0;
????????for(;fastIndex?<?nums.size();fastIndex++){
????????????if(nums[fastIndex]?!=?val){
????????????????nums[slowIndex++]?=?nums[fastIndex];
????????????}
????????}
????????nums.resize(slowIndex);
????????return?slowIndex;
????}
};
今日收獲:今日題目難度適中,主要學習了雙指針法、循環不變量的思想。深入理解了兩種定義區間的差別(這是之前刷的時候理解比較模糊的點)。
解題時間較少,深入理解代碼、整理博客時間較多,下次精簡整理。
學習時間2h。