704:二分查找
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
思路:
二分查找该题解使用都是左右闭区间[left,right]
- while(left<=right),因为left==right有意义
class Solution {
public int search(int[] nums, int target) {
int n=nums.length; //数组的长度
int left=0; //左区间
int right=n-1; //右区间
while(left<=right){
int mid=(left+right)/2; //中间
if(nums[mid]<target){ //如果目标值大于中间值,则目标值在右区间
left=mid+1;
}else if(nums[mid]>target){ //如果目标值小于·中间值,则目标值在左区间
right=mid-1;
}else{ //找到该目标值
return mid;
}
}
return -1; //未找到返回-1
}
}
27:移除元素
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
解法一:暴力破解
使用两次for循环,第一次for循环,遍历整个数组元素找到需要移除的元素,第二次for循环,如果找到需要移除的元素,将后面的值依次向前移动一位
class Solution {
public int removeElement(int[] nums, int val) {
//暴力破解
int len=nums.length;
for(int i=0;i<len;i++){
if(nums[i]==val){
for(int j=i+1;j<len;j++){
nums[j-1]=nums[j];
}
i--;
len--;
}
}
return len;
}
}
解法二:快慢指针
通过双指针在一个数组中进行操作即可,只需要一个for循环,时间复杂度降低
- 快指针:定位当前数组的位置,判断是否为目标元素
- 慢指针:定位新数组的位置,更加快指针来判断更新新数组的下标位置
class Solution {
public int removeElement(int[] nums, int val) {
//快慢指针:fast:当前数组的位置大小,寻找新的数组元素;slow:指向当前新的数组
int len=nums.length;
int fast=0,slow=0;
for(fast=0;fast<len;fast++){
if(nums[fast]!=val){
nums[slow]=nums[fast];
slow++;
}
}
return slow;
}
}
26:删除有序数组中的重复项
给你一个 非严格递增排列 的数组 nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums
中唯一元素的个数。
利用快慢指针
class Solution {
public int removeDuplicates(int[] nums) {
int len=nums.length;
int fast=0,slow=0;
for(fast=1;fast<len;fast++){
if(nums[fast]!=nums[slow]){
slow++;
nums[slow]=nums[fast];
}
}
slow++;
return slow;
}
}