题目链接力扣
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
int mid = (right - left) / 2;
int result =-1;
while (left < right) {
if (nums[mid] > target) {
mid = left + 1;
}
if (nums[mid] > target) {
mid = right -1;
}
if (nums[mid] == target) {
result = mid;
}
}
return result;
}
};
超出时间限制???,检查后发现边界条件缺少等于,因为我选择的是左闭右闭,所以left==right是有意义的,故循环条件里应有等号,再其次检查,发现mid定义错位置,需要定义在循环里去迭代,再一个就是发现左右值写错,左右值应更新为mid-1/mid+1,而上面写成了更新mid,两个均为>号,再一个把if,else条件做了更新,发现超出时间限制的根本原因是记录了结果,不是找到就返回,那么可能会陷入死循环,此题目并非需要记录返回值,而是找到就返回,正确代码如下:
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] < target) {
left = mid + 1;
}
else if (nums[mid] > target) {
right = mid -1;
}
else {
return mid;
}
}
return -1;
}
};
这道题目的前提是有序数组,且无重复元素。循环的边界条件容易出错,
第二题27https://leetcode.cn/problems/remove-element/
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int before = 0;
for (int front = 0; front < nums.size(); front++) {
if (nums[front] != val) {
nums[before++] = nums[front];
}
else{
continue;
}
}
return before ;
}
};
这个题的思路是一个指针遍历全部的数组筛选是否要替换掉这个值,在用一个指针来记录只记录不需要替换的值,这样就实现了前before个都是需要的值,返回值的时候我一开始进了+1,返回错误,因为在判断后有++,故before刚好是数组长度。