704、二分查找
文档讲解:代码随想录
题目: 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
思路:
1、设置左右指针begin、end。
2、找到中间位置mid=(begin+end)>>1,并判断中间位置处的值nums[mid]是否与目标值target相等。
3、若nums[mid]==target,则直接返回下标mid;
若nums[mid]>target,则右侧指针end移动到mid-1处;
若nums[mid]<target,则左侧指针begin移动到mid+1处;
代码:
//左闭右闭
class Solution {
public int search(int[] nums, int target) {
int begin = 0;
int end = nums.length - 1;
int mid = (begin + end) >> 1;
while (begin <= end) {
int midNum = nums[mid];
if (midNum == target) {
return mid;
} else if (midNum < target) {
begin = mid + 1;
} else if (midNum > target) {
end = mid - 1;
}
mid = (begin + end) >> 1;
}
return -1;
}
}
注意:
上述问题是定义在左闭右闭区间内的,如果说定义target是在一个在左闭右开的区间里,也就是[begin, end) ,即确定那么二分法的边界处理方式则不同。
//左闭右开
class Solution {
public int search(int[] nums, int target) {
int begin = 0;
int end = nums.length;
int mid = (begin + end) >> 1;
while (begin < end) {
int midNum = nums[mid];
if (midNum == target) {
return mid;
} else if (midNum < target) {
begin = mid + 1;
} else if (midNum > target) {
end = mid;
}
mid = (begin + end) >> 1;
}
return -1;
}
}
27、移除元素
文档讲解:代码随想录
题目: 给你一个数组nums和一个值val,你需要原地移除所有数值等于val的元素。元素的顺序可能发生改变。然后返回nums中与val不同的元素的数量。 假设nums中不等于val的元素数量为k,要通过此题,您需要执行以下操作:
- 更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
- 返回 k
思路:
①暴力解法:
■创建一个新数组nnums用于存放原数组nums中不等于val的值;
■首先遍历数组nums,找出其中不等于val的值,并存入数组nnums中,通过idx记录数组nnums的索引,得到不同值的个数。
■再通过遍历数组nnums,将新数组nnums的值覆盖掉原数组nums中的值。
②双指针法:
■定义快慢指针fast和slow;
■快指针fast遍历原数组,寻找与val不同的值,这些值将作为新数组的元素;
■慢指针slow指向更新新数组下标的位置,即将fast指针得到的新数组元素覆盖到原数组中。
代码:
//暴力解法
class Solution {
public int removeElement(int[] nums, int val) {
int n = nums.length;
int[] nnums = new int[n];
int idx = 0;
for (int i = 0; i < n; i++) {
if (nums[i] != val) {
nnums[idx] = nums[i];
idx++;
}
}
for (int j = 0; j < n; j++) {
nums[j] = nnums[j];
}
return idx;
}
}
//双指针
class Solution {
public int removeElement(int[] nums, int val) {
int slow = 0;
int n = nums.length;
for (int fast = 0; fast < n; fast++) {
if (nums[fast] != val) {
nums[slow] = nums[fast];
slow++;
}
}
return slow;
}
}