力扣刷题(一)——数组部分

本文介绍了力扣刷题中的数组部分,包括数组的基本概念、35题(数组元素插入)、27题(数组元素移除)、209题(长度最小的子数组)和删除数组重复元素的问题。通过实例解析了各种问题的解决方案,如二分法、双指针法和滑动窗口法,重点讲解了如何高效地进行数组操作。
摘要由CSDN通过智能技术生成

力扣刷题指南

刷题类型

数组-> 链表-> 哈希表->字符串->栈与队列->树->回溯->贪心->动态规划->图论->高级数据结构

数组

1、首先要掌握

想法简单的,实现起来不一定容易

数组的存储方式:数组是存放在连续内存空间上的相同类型数据的集合

  • 数组的下标是从0开始的
  • 数组在内存中的地址是连续的,因此删除或增加元素 时需要移动其他的元素

普通的删除操作如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QOkR6UW4-1631777230681)(C:\Users\Tunan\AppData\Roaming\Typora\typora-user-images\image-20210915144321955.png)]

时间复杂度是O(n),不适合做频繁的增删操作

二维数组其实就是一个矩阵

int[][] rating = new int[3][4]

在内存中的空间地址并不是3*4连续的

在这里插入图片描述

而是四条连续的地址空间组成

2、35题 数组的元素插入问题

给了一个无重复升序数组和一个目标值,找到目标值则返回索引,如果目标值不存在,则返回按顺序插入的位置

示例 1:
输入: [1,3,5,6], 5
输出: 2

示例 2:
输入: [1,3,5,6], 2
输出: 1

示例 3:
输入: [1,3,5,6], 7
输出: 4

示例 4:
输入: [1,3,5,6], 0
输出: 0

  • 暴力解法很好写:
class Solution {
   
    public int searchInsert(int[] nums, int target) {
   
        for(int i = 0; i < nums.length; i++) {
   
            if(nums[i]>=target) {
   
                return i;
            }
        }
        return nums.length;
    }
}

时间复杂度O(n),空间复杂度O(1)

  • 主要是仔细思考一下二分法:

有序数组是二分查找的基础条件

注意这里target定义的是左闭右闭的,所以while判断条件当min=max时,区间[min, max]依然有效。

最后返回的max+1,是找不到对应target元素的时候,考虑三种情况:

  1. 目标值在所有元素之前 此时min和max都指向了第一个元素下标为0,且执行了max-1操作,所以返回max+1=0;
  2. 目标值插入数组中的位置 此时min和max都指向了小于目标值的第一个元素,假设要插入的位置是n,且执行了max-1操作,所以返回max+1=n;
  3. 目标值在所有元素之后 此时min和max都指向了最后一个元素下标为nums.length,且执行了max-1操作,所以返回max+1=nums.length;
class Solution {
   
    public int searchInsert(int[] nums, int target) {
   
        int min = 0;
        int max = nums.length-1;
        int mid = 0;
        while(min <= max){
   
            mid = (int) ((max+min)/2);
            if(target == nums[mid]) {
   
                return mid;
            }else if(target > nums[mid]) {
   
                min = mid + 1;
            }else{
   
                max = mid - 1;
            }
        }
        return max+1;
    }
}

时间复杂度O(log n),空间复杂度O(1)

思考一下左闭右开的target怎么写?

3、27题 数组元素的移除

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值