代码训练营day01

 一、二分查找(leetcode704)

题目:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1

1. 二分查找的前提是已经排序好的数组

2. while的判断条件在于是闭闭(<=),还是闭开区间(<)

  • 如果是闭闭,right = mid -1
  • 如果是闭开,right = mid
    public  static int ReturnBinarySearchIndex(int [] nums,int target){
            // 二分查找
            int left = 0;
            int right = nums.length -1 ;
            int mid;
            while(left <= right){
                mid = (left + right ) / 2;
                if(nums[mid] < target){
                    left = mid + 1;
                }
                if(nums[mid] > target){
                    right = mid -1;
                }
                if(nums[mid] == target){
                    return mid;
                }
    
            }
            return -1;
        }

    二、数组的删除(leetcode24)

题目:给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

1. 注意事项:

  • 数组的删除并不是真正的删除,而是被重新赋值了
  • 数组的长度也并不是有多少数据就是有多长,而是可以根据自己来定义的

2. 三种方法

  1. 暴力破解
  2. 快慢指针法
  3. 双指针法

 

  /**
     * 由于数组是连续的,不能删除,所以删除只能通过重新赋值来实现"删除"
     *
     * @param nums
     * @param val
     * @return
     */
    public static int removeElement(int[] nums, int val) {
        if (nums == null || nums.length == 0) {
            return 0;
        }
        int length = nums.length;  // 实际的数组长度
        for (int i = 0; i < length; i++) {
            if (nums[i] == val) {
                for (int j = i + 1; j < length; j++) {
                    nums[j - 1] = nums[j];
                }
                i--;       // 指向删除位置的前一个位置,因为后面的数提前了一位,并且执行这段代码后i会+1
                length--;   // 删除了一个元素,实际长度-1
            }

        }
        return length;
    }

    /**
     * 利用快慢指针,通过直接赋值的手段简化了删除所需的移位操作
     * @param nums
     * @param val
     * @return
     */
    public static int removeElement01(int[] nums, int val) {
        int fast;
        int slow = 0;
        for (fast = 0; fast < nums.length; fast++) {
            if (nums[fast] != val) {
                nums[slow] = nums[fast];
                slow++;

            }
        }
        return slow;
    }

    /**
     * 双相指针法,利用左右两个指针,将右边的值赋给左边
     * @param nums
     * @param val
     * @return
     */
    public static int removeElement02(int [] nums, int val){

        int left = 0;
        int right = nums.length - 1;
        while(left <= right){
            if(nums[left] == val){
                nums[left] = nums[right];
                right--;
            }else {
                // 这里兼容了right指针指向的值与val相等的情况
                left++;
            }
        }
        return left;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值