704. 二分查找
- 边界值需注意
- left代表左边界下标值,right代表右边界的下标值
- 当数组只有一个元素时,此时如果找到该元素应该返回下标
0
,因此条件为left<=right
- 当mid的元素值大于target时,此时说明我们想找的target在右边,因此需要改变右边界的值,
right=mid-1
。当mid的元素小于target同理。
public int search(int[] nums, int target) {
int left = 0;
int 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) {
right = mid - 1;
}
else {
left = mid + 1;
}
}
return -1;
}
27. 移除元素
1. 暴力解法
public int removeElement(int[] nums, int val) {
// 暴力解法
int size = nums.length;
for (int i = 0; i < size; i++) {
// 若遇到val元素,则更新数组
if (nums[i] == val) {
for (int j = i+1; j < size; j++) {
nums[j-1] = nums[j];
System.out.println("size:"+size);
}
size--;
i--; // 由于整体向前移动了一位,因此该位的值需要进行判断,所以需要保持不动
}
}
return size;
}
2. 双指针方法
- 定义一个left指针,一个right指针,left指向需要移除的元素,right指针用来跳过val元素,不断来更新新的元素数组。
- 只要
nums[right]
不为val
,则更新left
指针的元素值,并同时递增两个索引。重复这一过程,直到right
到达数组末尾。left
为移除元素后的数组长度。
public int removeElement(int[] nums, int val) {
int left = 0;
for (int right = 0; right < nums.length; right++) {
if (nums[right] != val) {
nums[left] = nums[right];
left++;
}
}
return left;
}
3. 双指针优化方法
- 当删除的元素很少的时候(假设该数组只有第一个元素需要删除),此时使用第一种方法,假设
n
为数组元素的数量,则赋值操作需要进行n-1
次,因此需要进行优化。 - 当需要删除元素很少时(假设该数组只有第一个元素需要删除),我们只需要交换第一个元素和最后一个元素的值即可。因此我们定义
left
指针指向第一个元素,right
指针指向最后一个元素,若遇到要移除的元素时,便将left
此处的值赋为right
位置的值。
public static int removeElement(int[] nums, int val) {
int left = 0;
int right = nums.length - 1;
int size = nums.length;
while (left < size) {
if (nums[left] == val) {
nums[left] = nums[right];
right--;
size--;
}
else {
left++;
}
}
return size;
}
参考链接
- 移除元素双指针方法
文章来源地址https://www.toymoban.com/news/detail-641335.html
文章来源:https://www.toymoban.com/news/detail-641335.html
到了这里,关于【leetcode】第一章数组的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!