day01-leetcode(数组)

本文介绍了如何使用二分查找算法在有序数组中搜索目标值,以及两种方法移除元素:暴力破解和快慢指针优化。另外,还展示了如何在删除有序数组中的重复项时保持相对顺序。
摘要由CSDN通过智能技术生成

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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值