LeetCode704二分查找
自己的代码:
class Solution {
public:
int search(vector<int>& nums, int target) {
int left, right, mid;
left = 0;
right = nums.size()-1;
mid = (left + right) / 2;
while (left < right) {
if (nums[mid] == target) return mid;
else if (nums[mid] > target) { // target值在mid左边
right = mid - 1;
}
else if (nums[mid] < target) { // target值在mid右边
left = mid + 1;
}
mid = (left + right) / 2;
}
if (nums[left] == target) return left;
else return -1;
}
};
遇到的问题:在推出循环的时候left一定==right,但是要确认此时left下标的值==target,这里加一个判断。
LeetCode27移除元素
自己的代码:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int i, j; // 双指针法
for (i = 0, j = 0; j < nums.size(); j++) {
if (nums[j]==val) continue;
else {
nums[i] = nums[j];
i++;
}
}
return i;
}
};
思路:
一开始想的是把每个和val相同的数据赋值为-1,最后再遍历一遍,把-1的值删去,但是删去时候后面的数据往前移动,原本的数据就会有两份。
然后就想到了双指针法(之前有刷过这类题),慢指针指向新数组的下边,快指针遍历整个数组,但是在实现的时候还是遇到了问题。
一开始写成了这样
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int i, j; // 双指针法
for (i = 0, j = 0; j < nums.size(); ) {
if (nums[j]==val) j++;
else {
nums[i] = nums[j];
i++;
}
}
return i;
}
};
没有考虑清楚什么时候该快指针移动,应该每遍历一个数,快指针就后移一位,而慢指针是快指针对应的数据!=val时候把j对应的数据复制过来并后移一位。这里的错误是,当nums[j]==val的时候再后移一位,会导致如果一开始的数据或者中间有个数据nums[j]!=val的时候,j会一直保持在原地,而i不停地后移,而for语句没有对i进行终止,所以会溢出错误(粗浅的想法,我是非科班的,自学ing)