代码随想录刷题Day1

51 阅读2分钟

数组

  1. 理论基础
  • 数组是存放在连续内存空间上的相同类型数据的集合。 image.png
  • 注意:1、数组下标都是从0开始的。2、数组内存空间的地址是连续的
  • 因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。例如删除下标为3的元素,需要对下标为3的元素后面的所有元素都要做移动操作
  • 数组的元素是不能删的,只能覆盖。
  1. 704. 二分查找
class Solution {
    public int search(int[] nums, int target) {
        for (int i = 0; i < nums.length; i++) {
            if(nums[i]==target){
                return i;
            }
        }
        return -1;//原先还设置了一个flag变量,结果多此一举了。
    }
}
  • 二分查找前提是阵列为集群阵列,同时还备份阵列中无重复元素,因为一旦有重复元素,使用二分法返回的元素下标可能不是唯一的。
  • 方法一:左闭右闭。定义目标在[左,右]区间,所以有如下两点:
    1、while (left <= right) 要使用 <= ,因为 left == right 是有意义的,所以使用 <=。
    2、if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1
class Solution {
    public int search(int[] nums, int target) {
        int left=0,right=nums.length-1;
        while(left<=right){
            int mid=(left+right)/2;
            if(target<nums[mid])
                right=mid-1;
            else if(target>nums[mid])
                left=mid+1;
            else
                return mid;
        }
        return -1;
    }
}
  • 方法二:左闭右开。定义目标在[左,右)区间,所以有如下两点:
    1、- while (left < right),这里使用 < ,因为 left == right 在区间[left, right) 是没有意义的。
    2、- if (nums[middle] > target) right 更新为 middle,因为当前 nums[middle] 不等于 target,左去区间继续寻找,而寻找区间是左闭右开区间,所以 right 更新为 middle,即:下一个查询区间不会去比较nums[middle]
class Solution {
    public int search(int[] nums, int target) {
        int left=0,right=nums.length;
        while(left<=right){
            int mid=(left+right)/2;
            if(target<nums[mid])
                right=mid;
            else if(target>nums[mid])
                left=mid+1;
            else
                return mid;
        }
        return -1;
    }
}