代码随想录训练营-数组part01

259 阅读3分钟

代码随想录训练营-数组part01

数组理论

内存存储方式: 数组是连续的内存空间内存储相同类型元素的集合

数组获取元素的方式: 通过索引来进行获取,索引下表取值范围[0,array.length-1] 例如array[0]

数组数据存储的优缺点:

  1. 数组元素查找较为方便,可通过遍历或下标来进行获取;
  2. 因为存取方式是连续的,所以增删元素场景下,需移动其他相关元素,时间复杂度高

二维数组:

  1. 二维数组的表示类型为array[行索引][列索引]
  2. c++中二维数组为连续存储,每个相邻元素地址为对应数据类型所占字节数 例如 int类型数组,相邻元素内存地址相差4个字节,即为4
  3. java中内存寻址有jvm虚拟机操作

704-二分查找

二分查找的规律:

二分查找特征为左右两个指针同时进行遍历; 当右指针小于左指针时代表遍历结束; 优缺点分析

  1. 优点:
    1. 遍历速度快时间复杂度低O(logn);
    2. 空间复杂度低 O(1)
  2. 缺点:
    1. 限制较强,查找比较依赖有序数组
    2. 在有序不重复数组中适用性强

解题思路---704. 二分查找

  1. 关键词 有序 数组 搜索

  2. 进行区间划分 确认区间为[left,right] 或 [left,right)

  3. 若选择[left,right]

    class Solution {
     public int search(int[] nums, int target) {
         // 二分查找就是左右双指针遍历
         // 左右指针对应值与目标值进行对比 此时存在易错点  左右值与目标值对比
         // 获取中间指针,此时存在易错点  区间如何?中间指针如何保证取值是整数,此时应该以开闭空间来进行讨论
         int leftPoint = 0;
         // 闭区间写法[left,right]
         int rightPoint = nums.length -1;
         int result = -1;
         // 判别式取值<= 是因为要考虑仅有一个元素的场景,此时nums[middle]为本身
         // 闭区间写法[left,right]
         while(leftPoint <= rightPoint){
             // 向下取整
             int middle = (rightPoint - leftPoint)/2 + leftPoint;
             if(nums[middle] == target){
                 result =  middle;
                 break;
             }else if(nums[middle] < target){
                 leftPoint = middle + 1; // 闭区间[left,right]
             }else{
                 rightPoint = middle - 1;// 闭区间[left,right]
             }
    
         }
         return result;
    
       }
     }
    
  4. 若选择[left,right)

    class Solution {
    public int search(int[] nums, int target) {
        // 二分查找就是左右双指针遍历
        // 左右指针对应值与目标值进行对比 此时存在易错点  左右值与目标值对比
        // 获取中间指针,此时存在易错点  区间如何?中间指针如何保证取值是整数,此时应该以开闭空间来进行讨论
        int leftPoint = 0;
        // 闭区间写法[left,right]
        int rightPoint = nums.length -1;
        int result = -1;
        // 判别式取值<= 是因为要考虑仅有一个元素的场景,此时nums[middle]为本身
        // 闭区间写法[left,right]
        while(leftPoint <= rightPoint){
            // 向下取整
            int middle = (rightPoint - leftPoint)/2 + leftPoint;
            if(nums[middle] == target){
                result =  middle;
                break;
            }else if(nums[middle] < target){
                leftPoint = middle + 1; // 闭区间[left,right]
            }else{
                rightPoint = middle - 1;// 闭区间[left,right]
            }
    
        }
        return result;
    
      }
    }
    

27-移除元素

  1. 关键词
    1. 数组
    2. 空间复杂度限制
    3. 指定元素删除
  2. 解题思路
    1. 空间复杂度限制并且要进行数组的增删操作
    2. 考虑快慢指针,慢指针代表待更新的元素,快指针代表替换元素
    3. 返回数组的长度可以取最后一次更改慢指针的索引数值+1

class Solution {
    /**
        思考: 快慢指针处理,
        定义一个慢指针 slowPoint 初始为0
        i循环快指针fastPoint  初始为0,每次循环 若快指针对应元素不为val则赋值给慢指针,同时慢指针移动一位,最后返回的慢指针的下表即为最终数组的长度
     */
    public int removeElement(int[] nums, int val) {
     int slowPoint = 0;
     // 若只有一个元素,当为val时  slowpoint依然为0
     // 只有一个元素,不为val时 nums[0] = nums[0] 此时slowpoint会右移一位,成为1
     for(int quickPoint = 0 ; quickPoint <= nums.length - 1 ; quickPoint++){
         if(nums[quickPoint] != val){
             nums[slowPoint] = nums[quickPoint];
            slowPoint ++;
         }
     }
      return slowPoint;
    }
}