704. 二分查找
class Solution {
public:
int search(vector<int>& nums, int target) {
int l = 0;
int r = nums.size() - 1;
while (l <= r) {
int mid = l + ((r - l) >> 2);
if (nums[mid] < target) {
l = mid + 1;
} else if (nums[mid] > target) {
r = mid - 1;
} else {
return mid;
}
}
return -1;
}
};
运用二分法查找的前提是数组为有序数组。且需要注意数据的区间,数组中哪些元素可以取,哪些元素不可取,是左闭右闭区间还是左闭右开区间,这些都决定了二分法应怎么去写。
27. 移除元素
暴力:
一开始想成这样了,没有考虑全,更新后的数组大小有变,遍历数组的大小也要变。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int k = nums.size();
for (int i = 0; i < num.size(); i++) {
if (nums[i] == val) {
for (int j = i + 1; j < nums.size(); j++) {
nums[j - 1] = nums[j];
}
k--;
i--;
}
}
return k;
}
};
看答案修改后:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int k = nums.size();
for (int i = 0; i < k; i++) {
if (nums[i] == val) {
for (int j = i + 1; j < k; j++) {
nums[j - 1] = nums[j];
}
k--;
i--;
}
}
return k;
}
};
双指针:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int j = 0;
for (int i = 0; i < nums.size(); i++) {
if (nums[i] != val) {
nums[j++] = nums[i];
}
}
return j;
}
};
之前写过一次,这个方法很快写出来。
总结
千里之行,始于足下。期待后面的进步。