目录
二、 在排序数组中查找元素的第一个和最后一个位置
二分查找
题目链接:704、二分查找
前提条件:1、数组需是有序数组;2、数组中不要有重复元素,不然下标不唯一。
---给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
思路:需要定义好右指针right,若right = n - 1,则表示区间[left,right]是有效的数据,当left = right时区间内仍然是有效元素,需要继续参与循环;反之,若right = n,表示区间[left,right)是有效数据,当left = right时就要结束循环。
class Solution {
public int search(int[] nums, int target) {
int left = 0,right = nums.length - 1;
while(left <= right){
int middle = left - (left - right)/2;
if(nums[middle] < target)
left = middle + 1;
else if(nums[middle] > target)
right = middle - 1;
else
return middle;
}
return -1;
}
}
相关题目
一、搜索插入位置
链接:https://leetcode.cn/problems/search-insert-position/
---给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
思路:用二分查找出第一个大于等于target的下标即可,这里用pos进行跟踪
class Solution {
public int searchInsert(int[] nums, int target) {
int left = 0, right = nums.length - 1,pos = nums.length;
while(left <= right){
//>>优先性小于+,需要打括号,不然会超时
int mid =(right - left >>1) + left;
if(nums[mid] >= target){
pos = mid;
right = mid - 1;
}else
left = mid + 1;
}
return pos;
}
}
二、 在排序数组中查找元素的第一个和最后一个位置
链接:https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/
思路:用二分法先得到第一个大于等于target的下标
若返回值等于nums.length或返回值对应的数组元素不是target,则表示没有该元素,返回[-1,-1]即可,否则此时的返回值就是第一个位置;
然后在该位置遍历数组,持续更新end就可以找到最后一个位置了。
class Solution {
public int[] searchRange(int[] nums, int target) {
int index = getIndex(nums,target);
if(index == nums.length || nums[index] != target)return new int[]{-1,-1};
int end;
for(end = index; end < nums.length; end++)
if(nums[end] != target)break;
return new int[]{index,end-1};
}
public int getIndex(int[] nums, int target){
int left = 0,right = nums.length - 1,pos = nums.length;
while(left <= right){
int mid = (right - left >> 1) + left;
if(nums[mid] >= target){
pos = mid;
right = mid - 1;
}else
left = mid + 1;
}
return pos;
}
}
移除元素
题目链接:27、移除元素
注意: 数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖
---给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,元素的顺序可能发生改变。然后返回 nums
中与 val
不同的元素的数量。
思路:采用双指针法,遍历一次数组就能完成
fast:寻找新数组的元素 ,新数组就是不含有目标元素的数组
slow:指向更新 新数组下标的位置
class Solution {
public int removeElement(int[] nums, int val) {
int fast = 0,slow = 0;
while(fast < nums.length){
if(nums[fast] != val)
nums[slow++] = nums[fast++];
else
fast++;
}
return slow;
}
}
暴力解法:
class Solution {
public int removeElement(int[] nums, int val) {
int size = nums.length;
for(int i = 0; i < size; i++){
if(nums[i] == val){
for(int j = i + 1; j < size; j++)
nums[j - 1] = nums[j];
size--;
i--;//数组向前移了一位,不进行i--的话会错过原数组中第i+1位元素
}
}
return size;
}
}