leetcode数组刷题总结

LeetCode Hot100 刷题笔记(2)—— 子串、普通数组、矩阵 一、子串 二、普通数组 三、矩阵 阅读详情

理论基础

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

数组下标都是从0开始的。
数组内存空间的地址是连续的

704.二分查找

在这里插入图片描述
大家写二分法经常写乱,主要是因为对区间的定义没有想清楚,区间的定义就是不变量。要在二分查找的过程中,保持不变量,就是在while寻找中每一次边界的处理都要坚持根据区间的定义来操作,这就是循环不变量规则。
(左闭右闭)

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

二分查找系列题目

重要理论 涉及到二段性的问题

给结论
详细过程见此
在这里插入图片描述
在这里插入图片描述

华为机考:交易系统的阈值 (二段性查找问题) *****

在这里插入图片描述
对于边界值的选取 每次对mid left right的更新,如何保证不进入死循环

public class Solution1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String line = sc.nextLine();
        String[] parts = line.split(" ");
        int size = parts.length;
        int[] nums = new int[size];
        for(int i=0;i<size;i++){
            nums[i] = Integer.parseInt(parts[i]);
        }
        int target = sc.nextInt();

        //左闭右开区间
        int left = 0;
        int right = (int)1e5;
       // int right  = 15;
        while(left<right){
            int mid = (left+right+1)>>1;
//                int mid = (left+right)>>1;
            if(check(nums,mid,target)){
                left = mid ;
            }else{
                right = mid-1;
            }
        }
        System.out.println(left);


    }
    //是否满足要求
    public static boolean check(int[] nums,int limit,int target){
        int sum = 0;
        for(int i=0;i<nums.length;i++){
            if(nums[i]<=limit){
                sum += nums[i];
            }else{
                sum += limit;
            }
        }
        if(sum>target){
            return false;
        }else{
            return true;
        }
    }
}
153. 寻找旋转排序数组中的最小值

在这里插入图片描述

class Solution {
   //二分查找寻找数组的最小值
   public int findMin(int[] nums) {
       int left = 0;
       int right = nums.length - 1;
       while(left<right){
           int mid = (left + right)/2;
           if(nums[mid]>nums[right]){
               left = mid + 1;
           }else{
               right = mid;
           }
       }
       return nums[right];
   }
}
33. 搜索旋转排序数组 *****

在这里插入图片描述

class Solution {
    public int search(int[] nums, int target) {
        //在局部有序中使用二分查找
        int len = nums.length;
        if(len==0) return -1;
        if(len==1) return nums[0]==target?0:-1;
        int left = 0;
        int right = len - 1;
        while(left<=right){
            int mid = (left+right)/2;
            if(nums[mid] == target){
                return mid;
            }
            if(nums[0]<=nums[mid]){//左边有序
                if(nums[0]<=target && nums[mid]>target){//左闭右闭,左区间必须取等
                    right = mid - 1;

                }else{
                    left = mid + 1;  
                }
            }else{
                if(nums[mid]<target && target<=nums[right]){//同理 左闭右闭
                    left = mid + 1;
                }else{
                    right = mid - 1;
                }
            }
        }
        return -1;
    }
}
278. 第一个错误的版本

在这里插入图片描述
防止溢出:使用减法

/* The isBadVersion API is defined in the parent class VersionControl.
      boolean isBadVersion(int version); */

public class Solution extends VersionControl {
    public int firstBadVersion(int n) {
        int left = 1;
        int right = n;
        while(left<right){
            int mid = left+(-left+right)/2;
            if(isBadVersion(mid)){
                right = mid;
            }else{
                left = mid + 1;
            }
        }
        return left;
        
    }
}
35.搜索插入位置
34.在排序数组中查找元素的第一个和最后一个位置
69.x的平方根
367.有效的完全平方数

27.移除元素 (双指针)

在这里插入图片描述
在这里插入图片描述

class Solution {
    public int removeElement(int[] nums, int val) {
        int slow = 0;
        for (int fast = 0; fast < nums.length; fast++){
            if(nums[fast] != val){
                nums[slow] = nums[fast];
                slow += 1;
            }
        }
        return slow;
//双指针遍历到非val的值 slow+1
    }
}

相关题目推荐

26.删除排序数组中的重复项

在这里插入图片描述
双指针,慢指针指向新数组的元素,快指针用来遍历。只有当快慢指针不同时,进行元素复制。相同的话就进行指针的移动

class Solution {
    public int removeDuplicates(int[] nums) {
        if(nums.length == 1){
            return 1;
        }
        int slow = 0;
        int fast = 1;
        while(fast<nums.length){
            if(nums[slow] == nums[fast]){
                fast++;
            }else{
                nums[slow+1] = nums[fast];
                slow++;
                fast++;
            }
        }
        return slow+1;
    }
}
283.移动零
844.比较含退格的字符串
977.有序数组的平方

209.长度最小的子数组(最小滑动窗口)

在这里插入图片描述
窗口内是什么?
如何移动窗口的起始位置?
如何移动窗口的结束位置?

  1. 窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组。
  2. 窗口的起始位置如何移动:如果当前窗口的值大于s了,窗口就要向前移动了(也就是该缩小了)。
  3. 窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。
class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int result = Integer.MAX_VALUE;//定义无穷大
        int left = 0;
        int right = 0;
        int sum = 0;
        while (right<nums.length){
            sum = sum + nums[right];
            while (sum>=target){
                result = Math.min(result,right-left+1);
                sum = sum - nums[left];
                left++;
            }
            right++;
        }
        if (result==Integer.MAX_VALUE){return 0;}
        return result;
    }
}

滑动窗口模板总结

最小滑动窗口

while j < nums.length:
    判断[i, j]是否满足条件
    while 满足条件:
        不断更新结果(注意在while内更新!)
        i += 1 (最大程度的压缩i,使得滑窗尽可能的小)
    j += 1

最大滑动窗口

while j < nums.length:
    判断[i, j]是否满足条件
    while 不满足条件:
        i += 1 (最保守的压缩i,一旦满足条件了就退出压缩i的过程,使得滑窗尽可能的大)
    不断更新结果(注意在while外更新!)
    j += 1

区别

最大滑窗是在迭代右移右边界的过程中更新结果,而最小滑窗是在迭代右移左边界的过程中更新结果

相关题目

904.水果成篮(最大滑动窗口)
class Solution {
    //哈希表+最大滑动窗口
    public int totalFruit(int[] fruits) {
        int left = 0;
        int right = 0;//左右边界
        int result = 0;//最终结果
        int count = 0;//水果类别个数
        Map<Integer,Integer> map = new HashMap<>();//哈希表为 水果种类:个数
        for (int i=0;i<fruits.length;i++){
            map.put(fruits[i],0);
        }
        while(right<fruits.length){
            //1. 判断是否有当前水果(不存在的话类别加1) 其放入果篮当中 更新map
            if (map.get(fruits[right])==0){
                count++;//没有当前水果,种类要加1
            }
            map.put(fruits[right],map.get(fruits[right])+1);//放入果篮 key:水果类别,value:在原来的个数基础上加1
            // 2. 看当前水果种类是否大于2
            while (count>2){
                //判断第一种类别的水果个数是否为1(等于1的话 类别减去1) 更新map
                if (map.get(fruits[left])==1){
                    count--;
                }
                map.put(fruits[left],map.get(fruits[left])-1);
                left++;//左边界左移
            }
            result = Math.max(result,right-left+1);
            right++;
        }
        return result;
    }
}
76. 最小覆盖子串

在这里插入图片描述

class Solution {
    //最小滑窗
    public String minWindow(String s, String t) {
        if(s.length() == 0 || s == null || t.length() == 0 || t == null){
            return "";//特殊情况
        }
        int left = 0;
        int right = 0;
        int start = 0;//记录最终结果
        int size = Integer.MAX_VALUE;//记录字符串的大小
        int count = t.length();//需要的数
        int[] need = new int[128];//记录需要的字符个数
        for(int i=0;i<t.length();i++){
            need[t.charAt(i)]++;
        }

        while(right<s.length()){
            char c = s.charAt(right);//取字符
            if(need[c]>0){//需要这个字符
                count--;
            }
            need[c]--;//入窗口
            //当count==0,进行处理
            if(count == 0){
                while(left<right && need[s.charAt(left)]<0){//need元素小于0 说明他不是t所需要的
                    need[s.charAt(left)]++;
                    left++;
                } 
                //记录最大值
                if(right-left+1<size){
                    size = right - left + 1;
                    start = left;
                }
                //need>=0的情况了
                need[s.charAt(left)]++;
                left++;
                count++;//与前面区别
            }
            //更新右边界
            right++;
        }
        return size == Integer.MAX_VALUE ? "" : s.substring(start,start+size);

    }
}
1004. 最大连续1的个数 III
3. 无重复字符的最长子串

59.螺旋矩阵Ⅱ(模拟题目,考察代码能力)

在这里插入图片描述
模拟画圆圈,注意区间统一就好

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] result = new int[n][n];
        int loop = 0;//循环次数
        int i,j; //遍历的坐标
        int start = 0;//开始坐标 x和y相同
        int count = 1;

//1.循环画圈
        //边界全部采取左闭右开
        while (loop < n/2){
            //1.1 从左到右
            for (j = start;j < n-loop-1;j++){
                result[start][j] = count;
                count++;
            }
            // 1.2 从上到下
            for (i = start;i < n - loop-1;i++){
                result[i][j] = count;
                count++;
            }
            // 1.3 从右到左
            for (;j>loop;j--){
                result[i][j] = count;
                count++;
            }
            for(;i>loop;i--){
                result[i][j] = count;
                count++;
            }
            start++;
            loop++;
        }
//2.奇数个中间有点     
        if (n % 2 == 1){
            result[start][start] = count;
        }
        return result;
    }
}

相关题目

54.螺旋矩阵
剑指Offer 29.顺时针打印矩阵
leetcode刷题之轮转数组(超详解刷爆力扣) 大家好啊,我是小生啊🙈🙈🙈 我可没忘记带着大家刷题呢,嘿嘿兄弟姐妹们,我来啦😎😎😎让我们开始我们今天快乐的力扣刷题之旅吧,啦啦啦~~~ 😝😜😙 🌞🌞🌞 让我们一题多解,刷爆力扣,冲冲冲👊👊👊 力扣练习:轮转数组🏃🏃🏃一.🏠题目描述二.🏠题目分析三.🏠解决方法1.🚀思路一:化尾为头再循环挪动2.🚀思路二:开辟新空间优化时间3.🚀思路三:三次逆置(大神方法)四.🏠代码实现1.🚀方法一代码详解2.🚀方法二代码详解3.🚀方法三代码详解五. 🏠结语 一.🏠题目描述 嘿嘿,兄弟们,老规矩,直接看题: 🙊 🙊 阅读详情

相关推荐

开启力扣刷题之路 >【数组】> 二分法

【代码随想录】力扣刷题攻略 <<< 这是大佬的git链接,感兴趣的小伙伴一起追随大佬的脚步,少走弯路噢。---- 搬运工是我了。。。 根据大佬总结的刷题攻略开始力扣刷题!冲鸭! 文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入...

爱写bug的王六六 585

LeetCode(力扣)数组篇 JAVA刷题详解

是不是有许多小伙伴在刷力扣的时候感觉无从下手?从头按顺序开始刷的童鞋们可能会比较有感触,为什么才第四题就感觉很难了?没关系,本文将对力扣的 1-500 题中不需要会员的数据结构与算法题目(数据库与 shell 除外)进行分类,并推荐一个刷题的顺序。完全零基础可以刷题吗?不能,至少要基本掌握一门计算机语言的语法。但现在在网上随便搜一下就能搜到许多关于计算机语言的教程。当然,最好还是上一下正规的课程。刷题顺序很重要吗?重要。按照题目类别结构化地刷题的速度不仅更快,而且可以在刷完一类题之后进行总结。

weixin_61779644的博客 2538

手把手教你用Boot-Repair快速修复Ubuntu启动分区缺失(附详细命令行步骤)

本文详细介绍了如何使用Boot-Repair工具快速修复Ubuntu启动分区缺失问题,包括诊断、应急准备、自动修复和手动命令操作。通过grub rescue模式下的关键命令和Boot-Repair的图形界面操作,帮助用户高效解决启动分区故障,确保系统恢复正常运行。

weixin_29229989的博客 562

【刷题】LeetCode力扣中C语言返回数组

在力扣中刷题,选择C语言,如果要求的返回值是数组,会发现给的函数参数中有一个returnSize 这个参数的意义是指定返回数组的大小,否则会输出空数组 参考: https://ask.youkuaiyun.com/questions/7411484 https://blog.youkuaiyun.com/m0_73633144/article/details/131505924返回数组时不能直接在局部函数中进行定义,定义局部变量a,返回的是a的地址,而a是一个局部变量,当函数调用结束时,局部变量中数据可能已经不复存在了。 解决方法

m0_47088198的博客 499

用Python写个彩票小助手:自动生成双色球/大乐透号码并保存到桌面

本文介绍如何使用Python开发一个智能彩票助手,实现双色球和大乐透号码的随机生成与桌面文件保存功能。通过详细的代码示例,包括随机号码生成、文件操作、用户交互和错误处理,帮助Python初学者快速掌握实用工具开发技巧。

weixin_42566121的博客 515

吉林大学2016级唐班c语言期末考试B卷

` #include<stdio.h> #include<stdlib.h> //双指针法,每次从a,b中选一个最大的数,从后向前一次放在数组a中 int merge(int *a,int m,int *b,int n){ int i=m-1,j=n-1,k=m+n-1; while(i>=0&&j>=0){ if(a[i]>b[j])a[...

weixin_42339173的博客 1195

冲冲冲,力扣javascript刷题——数组总结

阶段性力扣刷题总结,为秋招做准备~

qq_41040989的博客 1448

黑群晖二合一已损毁_手动修复黑群晖已损毁磁盘空间

lz的用法是这样的,一个中古级mac mini 2011上装有vmware esxi 7.6, 然后上面挂载了lz的华芸Asustor Nas的iscsi空间,lz用的是basic volume,然后esxi上面有虚拟的黑群晖6.2.2-24922,黑群晖的docker里跑着不可描述软件,但是发现下载速度过快时,比如有好几个文件同时下载,总速度超过60MB/s以后storage manager里很...

weixin_39669629的博客 1万+

力扣刷题篇之二维数组

本系列是个人力扣刷题,刷题顺序按照[力扣刷题攻略] 今天写了二维数组,要难一点,这篇文章的题目还要自己多敲敲最快的代码。

m0_66076989的博客 638

LDA模型中文文本主题提取丨可视化工具pyLDAvis的使用

主题模型LDA的实现及其可视化pyLDAvis1. 无监督提取文档主题——LDA模型1.1 准备工作1.2 调用api实现模型2. LDA的可视化交互分析——pyLDAvis2.1 安装pyLDAvis2.2 结合gensim调用api实现可视化p.s. 保存结果为独立网页p.p.s. 加快prepare速度?2.3 如何分析pyLDAvis可视化结果2.3.1. **每个主题表示什么意义?**2.3.2 每个主题有多么普遍?2.3.3 主题之间有什么关联? 1. 无监督提取文档主题——LDA模型 这个模型

qq_39496504的博客 6万+

仿真学习系列(四十三):Sigrity仿真之平面谐振分析

在 SIGRITY 中,平面谐振分析(Plane Resonance Analysis)是一种用于分析信号完整性(SI)问题的高级仿真方法,尤其关注于层间电磁波的传播、谐振现象和信号衰减等问题。平面谐振分析通常用于电源分配网络(PDN)、信号线和参考平面之间的相互作用。本文将详细介绍如何在 SIGRITY 中进行平面谐振分析,并提供一些实用的分析方法与步骤,帮助工程师们识别和优化可能存在的设计问题。

案例文章,高速信号 480

力扣刷题——数组

题解:给定一个 S 和一个 T,请问你 S 中是否存在一个子串,包含 T 中所有字符且不包含其他字符。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。的异位词的子串,返回这些子串的起始索引。给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。空格将字符串中的单词分隔开。数组中心下标是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。题解:同上,输入一个串s,一个串p,找到s中所有p的排列,返回它们的起始索引。

qq_43762876的博客 1322

镜头调焦的 调整的是焦距还是像距?

在镜头 “调焦”(即日常拍照时的)中,调整的核心是,而非焦距。

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 1350

LeetCode刷题1929-简单-数组串联

LeetCode刷题1929-简单-数组串联,我敢说这是力扣最简单的一道题,最适合第一次刷力扣的人做

布小禅的博客 913

RK3588嵌入式AI工业部署:YOLOv11 + OpenCV实时推理系统全栈实现

接下来,你可以尝试优化模型(如量化、剪枝)、扩展功能(如多摄像头推理、结果上传到云端),让你的AI应用更加完善。不需要担心技术门槛,我们会一步步带你完成环境搭建、模型转换、部署推理的全流程,最终让你在RK3588上体验AI目标检测的丝滑快感。首先,我们需要把YOLOv11的PyTorch模型(.pt格式)转换成ONNX格式,这是模型部署的第一步。此时,你应该能看到摄像头画面中出现了实时的目标检测框,标注着检测到的物体类别和置信度。文件,这就是RK3588可运行的模型文件。文件,这就是转换后的ONNX模型。

LXY_LOVE36的博客 245

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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

使用练习 二级标题 字体 强调内容 双星号 斜体 单星号 删除线 双波浪线 有序列表 回车自动生成 1+空格 无序列表 加号+空格 Ctrl+T自动生成列表,选择对应的行列数 二级标题 分割线 三个-加回车 插入本地图片拖入即可 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NAb0TaMB-1631672845821)(C:\Users\Tunan\AppData\Roaming\Typora\

North_City_的博客 604

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

力扣刷题Hot100之普通数组

比如7个数k=3 由[0,1,2,3,4,5,6]->[6,5,4,3,2,1,0]->[4,5,6,0,1,2,3]比较(x+nums[i],nums[i])记录当前最大和,并且比较(x,max)记录数组最大和,遍历得到结果。如果先(0,2)(3,6)数组就是[2,1,0,6,5,4,3]->[3,4,5,6,0,1,2]其实反推很好想出来,假如每次循环一次就返回到原点那循环到k-1就结束,最小公约数为k。利用动态规划解决,遍历数组,用变量x记录前一位的最大和,max为数组最大和。

weixin_74567525的博客 1746

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

力扣刷题【数组篇】

力扣刷题 ------ > 数组篇 冲冲冲!!!

Hou_lang_LJ的博客 212

力扣数组刷题总结之c实现(常更)

数组;c语言;刷题总结

freeline的博客 2136

我的Leetcode刷题笔记:数组

我的Leetcode数组刷题指南

charlie114514191的博客 1363

力扣刷题-数组

力扣数组题型优解

ssy15211936768的博客 1347

leetcode刷题之轮转数组(超详解刷爆力扣)_力扣循环数组

都到这里了,相信大家都能理解这种思路了,但是这种每次向右边轮转数组,所有的值就要往后挪一次,时间复杂度较大,那我们有没有什么方法把他优化一下呢?😖😖😖我们看接下来的思路二。😃😃😃 到了这里我们完成了一半啦,接着往下看:👀👀👀最后将新数组的元素再拷贝一份放入原数组就可以了。但是如果K大于数组最大的长度的时候我们会发现出现问题,因此我们待会需要处理一下。 跟着思路走下去💪💪💪 最后我们发现竟然真的成功了,不愧是大神的方法,时间复杂度和空间复杂度都优化了。思路我们分析好了让我们直接上代

2401_88972074的博客 872

【日志】力扣刷题 -- 轮转数组

光看名字与《末路狂花钱》很像,实际灵感来源于《瑞克与莫迪》(忘记第几季第几集),爷孙二人来到一个即将因太阳爆炸而毁灭的星球上狂欢,这里正举办一个末日派对,一直到毁灭为止。剧情:大概上是一开始所有人都取出钱来花,印钞厂开始疯狂印钱,商品到最后都是免费的?——每天努力十五分钟,一年就努力了5475分钟,也就是91.25小时。(记得乘上0.7,这是扣去双休和法定的节假日的时间的)如果说GTA5是自由的,那这个就是释放天性,放纵的。创建新的数组就可以拿到原数组的数据,又可以对新数组进行排序。

wacanda的博客 829

leetcode刷题数组篇总结

文章目录前言leetcode刷题数组题型和技巧一.数组的二分查找二.双指针删除元素三.滑动窗口 前言 leetcode刷题数组: 这是我第一次开始认真做题和写博客,希望我能一直坚持下去,每天可以做一道题或者两道题然后写博客.养成刷题的习惯,基本上每一次做题我都能惊讶大佬的题解这么巧妙,有时候真的会感觉到智商上的不足,所以只能用量来锻炼自己.我这些题都是跟着别人的推荐做的顺序,从数组开始到后面的贪心,动态规划什么的.一步步做下去深入,坚持锻炼自己的算法能力.希望自己也能写出让别人看到后会惊讶的题解.

公仔面 417

【JAVA刷题初阶】刷爆力扣第六弹——数组

买卖股票的最佳时机 && 多数元素 && 删除有序数组中重复项

爱打酱油的新一的博客 807

力扣刷题35,数组——二分查找704相似题

属于简单题,第一次做,感觉题目就是比704多了一小步,但是自己的思路设计复杂了,多加了一个for循环,说明完全没有注意到二分查找的终止条件是什么。二分查找不仅用于查找,还能用于定位某种性质的边界点这类问题是典型的“寻找第一个 ≥ target 的位置”,属于二分查找的一个经典变体。解题思路:先明确是否找得到,找不到的时候要考虑临界情况是什么。

Betty_textbook的博客 825
上一篇: leetcode回溯算法刷题总结
下一篇: leetcode链表刷题总结
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值