leetcode 704 二分查找
题目链接
状态:做出来了
文档:programmercarl.com
思路: 关键是有序,用二分查找比大小即可。
实现过程:
选择了左闭右闭的规则,所以在while循环中可以设置条件 low <= high
但是运行代码报错,原因是:
int mid = (low+high)/2;
这段代码写在了while循环的外面,这是不行的
因为在循环里也要不断更新low和high的值,随之mid的值也要进行改变,
所以这段代码要放到while循环中才可以
代码:(两种写法:左闭右闭 和 左闭右开)
class Solution {
public:
int search(vector<int>& nums, int target) {
//左闭右闭
int low = 0,high = nums.size()-1;
while(low <= high) //high可以取到值,所以<=
{
//mid一定要放到while循环中,因为要不断更新mid
int mid = (low+high)/2;
//中间值<目标值,说明中间值小了,所以往右找 更新low
if(nums[mid] < target) low = mid+1;
//中间值>目标值,说明中间值大了,所以往左找 更新high
else if(nums[mid] > target) high = mid-1;
//目标值=中间值
else return mid;
}
//没找到,return -1
return -1;
}
};
class Solution {
public:
int search(vector<int>& nums, int target) {
//左闭右开 [ )
int low = 0,high = nums.size();
while(low < high) //high不可以取到值,所以<
{
//mid一定要放到while循环中,因为要不断更新mid
int mid = (low+high)/2;
//中间值<目标值,说明中间值小了,所以往右找 更新low
if(nums[mid] < target) low = mid+1;
//中间值>目标值,high取不到mid 所以比较的时候比较的是mid-1
else if(nums[mid] > target) high = mid;
//目标值=中间值
else return mid;
}
//没找到,return -1
return -1;
}
};
收获: 这道题还是比较简单的,主要就是要分清楚遵循的规则是什么。
leetcode 27 移除元素
题目链接
状态:
文档:programmercarl.com
思路: 不能开辟新的空间,只能在原有数组上进行改动,这就涉及了覆盖的操作。要注意的是,数组中的地址是连续的,不能随意删除,只能进行覆盖。
看完文档后的思路:
双指针法,分别设定一个i 和一个j,i 表示新数组的下标,j 去遍历数组的每一个元素,查看是否和target相同。如果nums[j] == target的话,就往前移,i不动,覆盖之后 i 和 j 都往后移动。
那么也就是相当于,nums[j] != target时, 一直往前移,i也要随之进行++,如果相等,那么i不动,等待 j 匹配到不相等的值的时候再让 j 去给 i 赋值。
代码:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int j = 0; //j去遍历数组
int i = 0; //i是新数组的下标
while(j<nums.size())
{
//不等于的时候 进行赋值移动
if(nums[j] != val)
{
nums[i] = nums[j];
i++;
j++;
}
else
{
//相等的时候 i不动,只让j继续遍历 直到匹配到不相等
j++;
}
}
return i;
}
};
收获: 使用双指针法是非常方便的,还是要整理好i和j的逻辑关系,理清楚谁先走 谁后走 谁怎么走的。i:赋值之后才走,不赋值不走。j:遍历,不管怎么样都要往后走,而且走的还会比 i 快。