704. 二分查找
思考
二分查找之前学过的,做起来相对容易一些。第一次接触二分查找,有些细节确实感到很困惑。像是循环的跳出条件这些,还有开闭区间问题,都有一些难理解。当时是结合一些具体的例子去一点点理解的,按照代码一步去走,走下来之后就会有一些体会了,最终产生理解的感觉。
现在基本上是把这个代码给记住了,没有刻意去分析其中的逻辑,有点顺其自然了,不知道这样是好还是不好。
代码
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
// int mid = left + (right - left) / 2; 优化1:代码简洁性
while(left <= right){
int mid = left + (right - left) / 2;
if(target == nums[mid]){
return mid;
}
else if(target > nums[mid]){
// left = mid; 错误1:导致超出时间限制,此种写法,中间元素不用再判断
left = mid + 1;
// mid = left + (right - left) / 2;优化1:代码简洁性
}
else{
// right = mid; 错误1
right = mid - 1;
// 优化1:mid = left + (right - left) / 2;优化1:代码简洁性
}
}
return -1;
}
27. 移除元素
示例 1:
输入: nums = [3,2,2,3], val = 3
输出: 2, nums = [2,2]
解释: 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。
示例 2:
输入: nums = [0,1,2,2,3,0,4,2], val = 2
输出: 5, nums = [0,1,4,0,3]
解释: 函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。
提示:
0 <= nums.length <= 1000 <= nums[i] <= 500 <= val <= 100
思考:
这一题使用双指针法会方便一些,最早接触这一思想是在数据结构的学习时。记得荷兰国旗问题就是用这个思想来解的,具体有点记不清楚了。
代码
int removeElement(vector<int>& nums, int val) {
int size = nums.size();
int index1 = 0;
int index2 = nums.size() - 1;
while(index1 <= index2){
if(nums[index1] == val){
nums[index1] = nums[index2];
index2--;
size--;
}
else{
index1++;//不相等则index指针后移一位
}
}
return size;
}