代码随想录刷题Day1(力扣27,704)

Day1 数组

  704.二分查找,27. 移除元素

一、基础知识

  java数组相关的api

数组的创建、初始化、访问、复制、排序等操作

  • 创建和初始化数组:

int[] numbers = new int[5]; // 创建长度为5的整数数组
numbers[0] = 10; // 初始化数组元素

  • 访问数组元素:

int firstNumber = numbers[0]; // 访问第一个元素

  • 数组复制:

int[] copy = Arrays.copyOf(numbers, numbers.length); // 复制整个数组

  • 数组排序:

Arrays.sort(numbers); // 对数组进行排序

  • 查询数组元素:

int index = Arrays.binarySearch(numbers, 10); // 二分查找元素10的索引

  • 填充数组:

Arrays.fill(numbers, 0); // 将数组所有元素填充为0

  • 比较数组:

boolean areEqual = Arrays.equals(numbers, copy); // 比较两个数组是否相等

  • 部分数组排序的api
 public static void sort(int[] a, int fromIndex, int toIndex);

二、题目

image-20240703202417250

image-20240703202458357

梳理

1. 704

​ 704是中规中矩的二分法模版题,最容易错的是边界的控制

第一种

定义 target 在left, right)

class Solution {
    public int search(int[] nums, int target) {
        int left = 0;
        int right = nums.length;
        while(left<right){
            int mid = (left + right)/2;
            if(nums[mid] == target){
                return mid;
            }else if(nums[mid]>target){
                right = mid;
            }else {
                left = mid + 1;
            }
        }
        return -1;
    }
}
第二种

定义 target 在left, right]

class Solution {
    public int search(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        while(left<=right){
            int mid = (left + right)/2;
            if(nums[mid] == target){
                return mid;
            }else if(nums[mid]>target){
                right = mid - 1;
            }else {
                left = mid + 1;
            }
        }
        return -1;
    }
}

二分查找法:两种区间定义的归纳

描述范围定义right 初始值循环条件right 变化方式left 变化方式
第一种方法[left, right)nums.lengthleft < rightright = midleft = mid + 1
第二种方法[left, right]nums.length - 1left <= rightright = mid - 1left = mid + 1
2. 27

27是移除给定的元素。这里要妥善的处理移除,因为数组里面地址是连续的,所以不能直接“拿掉”目标,而是通过移动-覆盖的方式。

代码

  • 704
class Solution {
    public int search(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        while(left<=right){
            int mid = (left + right)/2;
            if(nums[mid] == target){
                return mid;
            }else if(nums[mid]>target){
                right = mid - 1;
            }else {
                left = mid + 1;
            }
        }
        return -1;
    }
}
  • 27
class Solution {
    public int removeElement(int[] nums, int val) {
        int count = 0;
        for (int i = 0; i < nums.length; i++) {
            //如果不是目标值就依次向前覆盖
            if(nums[i] != val)nums[count++] = nums[i];
        }
        return count;
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值