704. 二分查找
第一种写法:定义target在一个左闭右闭的区间里,[left, right]
//Version 1.1 C++
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1; // 定义target在左闭右闭的区间里,[left, right]
while (left <= right) { // 当left==right,区间[left, right]依然有效,所以用 <=
int middle = left + ((right - left) / 2);// 防止溢出 等同于(left + right)/2
if (nums[middle] > target) {
right = middle - 1; // target 在左区间,所以[left, middle - 1]
} else if (nums[middle] < target) {
left = middle + 1; // target 在右区间,所以[middle + 1, right]
} else { // nums[middle] == target
return middle; // 数组中找到目标值,直接返回下标
}
}
// 未找到目标值
return -1;
}
};
time complexity: O(log n)
space complexity: O(1)
第二种写法:定义target在一个左边闭右开的区间里,[left, right)
//Version 1.2 Java
class Solution {
public int search(int[] nums, int target) {
int left = 0, right = nums.length; //定义target在左闭右开的区间里:[left, right)
while(left < right){ //因为left==right,在[left, right)是一个无效,所以我们用<
int mid = left + ((right - left) >> 1);
if(nums[mid] == target) return mid; //target在左区间,在[left, mid)中
else if(nums[mid] < target) left = mid + 1; //target在右区间,在[mid + 1, right]中
else if(nums[mid] > target) right = mid;
}
return -1;
}
}
Time Complexity: O(log n)
Space Complexity: O(1)
27. 移除元素
双指针法:通过一个快指针和一个慢指针在一个for loop下完成两个for loop的工作
快指针i:寻找新的数组元素,新数组就是不含有目标元素的数组
慢指针j: 指向更新的 新的数组的下标的位置
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int i = 0;
for(int j=0;j<nums.size();j++){
if(val!=nums[j]){
nums[i++] = nums[j];
}
}
return i;
}
};
time:O(n)
space:O(1)