704.二分查找
思路:采用二分查找,注意确定查找的区间,可以是[left, right],也可以是[left, right),两种区间对于边界的操作有所不同。本次确定的区间为[left, right]
时间复杂度:O(logn)
class Solution {
public int search(int[] nums, int target) {
int left = 0, right = nums.length - 1;
int mid;
while (left <= right) {
mid = left + (right - left) / 2;
if (nums[mid] == target) {
return mid;
} else if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
}
27.移除元素
思路:采用相向双指针法,两个指针从数组两端往中间走,遇到要移除的元素直接放到数组最后面。也可以使用快慢指针法,快指针一直走到数据结束,只有当快指针元素不是要删除元素时,快指针元素赋给慢指针元素,并且慢指针往前走一个。
注意:相向双指针法改变数组中元素顺序,快慢指针法不改变数组中元素顺序。
时间复杂度:O(n)
相向双指针法
class Solution {
public int removeElement(int[] nums, int val) {
int left = 0, right = nums.length - 1;
while (left <= right) {
while (right >=0 && nums[right] == val) {
right--;
}
while (left <= right && nums[left] != val) {
left++;
}
if (left <= right) {
nums[left] = nums[right];
left++;
right--;
} else {
return left;
}
}
return left;
}
}
快慢指针法
class Solution {
public int removeElement(int[] nums, int val) {
int slow = 0;
for (int fast = 0; fast < nums.length; fast++) {
if (nums[fast] != val) {
nums[slow++] = nums[fast];
}
}
return slow;
}
}