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

力扣刷题指南

刷题类型

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

数组

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值