数组:存放在连续内存空间上的相同数据类型的集合
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。