704二分查找
题目连接:二分查找
一开始的思路还是没有完全整理好,顾名思义,就直接考虑了二分查找的方式,而没有考虑暴力解法。
此外,在二分查找时还出现了一个bug:
for(int i = 0; i <= j; i++) {
int n = (i + j)/2 ;
printf("n = %d\n", n);
if(target == nums[n]) {
return n;
} else if (target > nums[n]) {
i = n + 1;
} else {
j = n - 1;
}
if(i > j) {
break;
}
}
return -1;
自以为没问题,但却一直运行出错,最后debug才意识,采用for循环并结合左右边界i,j的形式,实际上会使得for的每一次循环,都会重置对i的赋值,即i++,而不能实现i=n+1的操作,而导致错误。
因此,核心代码为:
while(i <= j) {
int n = (i + j)/2 ;
if(target == nums[n]) {
return n;
} else if (target > nums[n]) {
i = n + 1;
} else {
j = n - 1;
}
}
return -1;
补充笔记:
1.注意题目条件:有序数组、无重复元素
2.什么时候选择i<=j的情况,即左右边界都为闭区间,即i=j,数组能取到有意义的值的时候。
27移除元素
题目连接:移除元素
在读懂题目之后,脑海里想到的词就是,”覆盖“。而更加灵活关键的是,从题目中要求的 ”移除数值与val相等的元素“ 转换为用不相等的元素来判断。不足之处仍然是没有好好梳理暴力求解的思路。
int index = nums.size();
int n = 0;
for(int i = 0; i < nums.size() ; i++) {
if(nums[i] != val) {
nums[n] = nums[i];
n++;
}else {
}
}
// printf("index = %d", index);
return n ;
}
然后采用双指针的方式对该数组进行遍历和更新