leetcode-704 二分查找
具体思路:二分查找用于在有序数组中查找信息,分别取数组的最左端和最右端为 left = 0 和 right = nums.size() - 1,在用另一个变量 mid 记录中间位置的值,即 mid = (left + right)/ 2,也可以用 mid = (right - left)/ 2 + left 来计算中间位置的下标。通过将中间位置的值同要查找的数值(target)比较,选择让搜索区间是左侧向中间缩还是右侧向中间缩。因为在有序数组中要么从大到小;要么从小到大排列,(以升序为例)当中间值比查找的值小是,那么左侧的值均比要查找的值要小,所以要将左侧向中间缩,即 left = mid + 1;若中间值比要查找到的值大,那么就让 right = mid -1。
二分查找实际就是通过不停地让中间位置的值去比较判断我要查找的数值应该存在于哪个区间,进而不断的将区间缩小。
对于查找值的判断只有3种情况:
- nums[mid] == target;
- nums[mid] < target;
- nums[mid] > target;
(以升序为例)等于 则直接返回 mid,
小于 则另 left = mid + 1,
大于 则另 right = mid - 1。
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
int search(vector<int>& nums, int target) {
int left,right;
left = 0,right = nums.size() - 1;
while(left <= right) {
int mid = (left + right) / 2;
if(nums[mid] == target) {
return mid;
}
else if(nums[mid] < target) {
left = mid + 1;
}
else {
right = mid - 1;
}
}
return -1;
}
};
leetcode-27移除元素
思路:双指针法,遍历数组将非val元素依次放入数组中,并记录长度。
right遍历整个数组,left记录新数组的长度,当 nums[right] = val 时跳过(因为不管是不是最终的结果都会被覆盖),当 nums[right] != val 时将此时的值把 left 所指的值覆盖。(原本想的是交换,最后看了题解才发现可以直接覆盖)
class Solution {
public:
int removeElement(vector<int>& nums, int val) { //双指针法
int n = nums.size();
int left = 0;
for (int right = 0; right < n; right++) {
if (nums[right] != val) {
nums[left] = nums[right];
left++;
}
}
return left;
}
};
(菜鸡勿喷)