Leetcode刷题-数组(二分法、双指针法、窗口滑动)

数组

1、二分法

  • 704. 二分查找 - 力扣(LeetCode)

需要注意区间的问题。首先在最外面的循环判断条件是left<=right。那就说明我们区间规定的范围就是【left,right】

属于是左闭右闭!!!!!!

那之后在判断target和我们数组中的num [ mid ] 大小关系之后,再重新调整right,以及left的时候,应该是left = mid + 1,right = mid - 1

  • while (left <= right) 要使⽤ <= ,因为left == right是有意义的
  • 所以使⽤ <= if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]⼀定不是target,那么接 下来要查找的左区间结束下标位置就是 middle - 1

2、移除元素(双指针-同向)

  • 27. 移除元素 - 力扣(LeetCode)

除了可以暴力两层循环这么去从后往前覆盖,从而消除掉目标元素

还可以使用双指针法:快慢指针(重点是理解快慢指针什么含义)!!!!!!!!

  • 快指针:遍历数组,去寻找新数组的元素,就是通过这个指针去找出来,除了目标元素的所有值

  • 慢指针:用于指向新数组的下标,就是通过快指针找到符合条件的元素(不是需要删除的元素)就将其放进“新数组”,慢指针指向的下标就会+1

int slow = 0;
for(int fast = 0; fast < nums.length; fast++){
    if(nums[fast] != target){
        nums[slow++] = nums[fast];
    }
}

3、有序数组的平方(双指针-相向)

题目需求:一个有序数组,存在有负数,所有元素依次取平方要求最后还是有序

  • 977. 有序数组的平方 - 力扣(LeetCode)

根据题意可以知道,最大值肯定出现在数组的左右两侧

所以还是想到用双指针的思路,两个指针分别指向数组的开头和结尾,然后向中间移动

符合条件的放进新的数组中

public int[] sortedSquares(int[] nums) {
    int k = nums.length - 1;    
    int[] res = new int[k+1]; 		//注意数组长度定义
    for(int i=0,j=k; i<=j; ){
        if(nums[i]*nums[i] > nums[j]*nums[j]){
            res[k--] = nums[i] * nums[i];
            i++;
        }
        else {
            res[k--] = nums[j] * nums[j];
            j--;
        }
    }
    return res;
}

4、⻓度最⼩的⼦数组(滑动窗口)

  • 209. 长度最小的子数组 - 力扣(LeetCode)

在这里插入图片描述

除了暴力解决,还有滑动窗口思路

其实也就是双指针的思路,不过是取两个指针中间的一个集合,像是一个滑动的窗口

最后目标的长度就是:指针2 - 指针1 + 1

然后需要明确一下两个指针的含义:

  • 指针1:for循环里面的指针 j ,这个是指向这个区间的终止位置的,我们的目标是通过对开始位置 指针i 进行操作然后更新最小长度
  • 指针2:这个用来标记开始位置,和指针1结合使用

1、窗⼝的起始位置如何移动:如果当前窗⼝的值⼤于s了,窗⼝就要向前移动了(也就是该缩⼩了)。

2、**窗⼝的结束位置如何移动:**窗⼝的结束位置就是遍历数组的指针,也就是for循环⾥的索引。

解题的关键在于 窗⼝的起始位置如何移动,相当于是sum一边吐出之前区间中最开始的数据,然后再加上一下个数据,之后再利用标记开始位置的指针2,再取判断
class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int i = 0;    // 滑动窗⼝起始位置,也就是指针2
        int sum = 0;  // 滑动窗⼝数值之和
        int minLen = Integer.MAX_VALUE;  
        for(int j = 0; j < nums.length; j++){
            sum += nums[j];
            while(sum >= target){
                int len = j - i + 1;
                minLen = Math.min(minLen,len);
                sum -= nums[i]; // 这⾥体现出滑动窗⼝的精髓之处,不断变更i(⼦序列的起始位置)
                i++;
            }
        }
        return minLen == Integer.MAX_VALUE ? 0 : minLen;  // 如果result没有被赋值的话,就返回0,说明没有符合条件的⼦序列
    }
}

5、螺旋矩阵II (知道思路即可,有空再练代码)

  • 59. 螺旋矩阵 II - 力扣(LeetCode)

在这里插入图片描述

⾯试中出现频率较⾼的题⽬,本题并不涉及到什么算法,就是模拟过程,但却⼗分考察对代码的 掌控能⼒。

这里容易遇到的问题是:

就是因为在画每⼀条边的时候,⼀会左开右闭,⼀会左闭右闭,⼀会⼜来左闭右开,岂能不乱。

比如第一次是1、2、3,第二次遍历第二条边又成了4、5,不包含起始节点了,这样就很乱,肯定会出问题

int[][] res = new int[n][n]; // 使⽤vector定义⼀个⼆维数组
int startx = 0, starty = 0; // 定义每循环⼀个圈的起始位置
int loop = n / 2; // 每个圈循环⼏次,例如n为奇数3,那么loop = 1 只是循环⼀圈,矩阵中间的值需要单独处理
int mid = n / 2; // 矩阵中间的位置,例如:n为3, 中间的位置就是(1,1),n为5,中间位置为(2, 2)
int count = 1; // ⽤来给矩阵中每⼀个空格赋值
int offset = 1; // 需要控制每⼀条边遍历的⻓度,每次循环右边界收缩⼀位
int i,j;
while (loop > 0) {
    i = startx;
    j = starty;
    // 下⾯开始的四个for就是模拟转了⼀圈
    // 模拟填充上⾏从左到右(左闭右开)
    for (j = starty; j < n - offset; j++) {
        res[startx][j] = count++;
    }
    // 模拟填充右列从上到下(左闭右开)
    for (i = startx; i < n - offset; i++) {
        res[i][j] = count++;
    }
    // 模拟填充下⾏从右到左(左闭右开)
    for (; j > starty; j--) {
        res[i][j] = count++;
    }
    // 模拟填充左列从下到上(左闭右开)
    for (; i > startx; i--) {
        res[i][j] = count++;
    }
    // 第⼆圈开始的时候,起始位置要各⾃加1, 例如:第⼀圈起始位置是(0, 0),第⼆圈起始位置是(1, 1)
    startx++;
    starty++;
    // offset 控制每⼀圈⾥每⼀条边遍历的⻓度
    offset += 1;
    loop--;
}
// 如果n为奇数的话,需要单独给矩阵最中间的位置赋值
if (n % 2 != 0) {
    res[mid][mid] = count;
}
return res;

注:本篇是跟着代码随想录刷题练习,不过是自己的刷题总结,使用的刷题语言是Java

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/513628.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

I2C总线与AT24C02

目录 I2C总线 I2C总线介绍 I2C电路规范 I2C时序结构 起始与终止 代码理解 发送字节 代码理解 接收字节 代码理解 数据应答 代码理解 I2C的数据据帧 发送数据帧 接收数据帧 发送接收数据帧 AT24C02芯片 AT24C02介绍 引脚及应用电路 内部结构图 AT24C02数据…

Android 高德地图

1.获取Key 进入高德开放平台控制台&#xff0c;创建一个新应用。在创建的应用上点击"添加key"按钮&#xff0c;在弹出的对话框中&#xff0c;依次输入key名称&#xff0c;选择服务平台为“Android平台”&#xff0c;输入发布版安全码 SHA1、以及 Package。 获取 S…

贵州省NPP净初级生产力数据/NDVI数据

数据福利是专门为关注小编博客及公众号的朋友定制的&#xff0c;未关注用户不享受免费共享服务&#xff0c;已经被列入黑名单的用户和单位不享受免费共享服务。参与本号发起的数据众筹&#xff0c;向本号捐赠过硬盘以及多次转发、评论的朋友优先享有免费共享服务。 净初级生产…

Vue3从入门到实战:路由的query和params参数

在Vue 3中&#xff0c;我们可以通过路由的查询参数来传递数据。这意味着我们可以在不同的页面之间传递一些信息&#xff0c;以便页面可以根据这些信息来显示不同的内容或执行不同的操作。 查询参数的使用方式类似于在URL中添加附加信息&#xff0c;以便页面之间可以根据这些信息…

基于springboot+vue实现的酒店客房管理系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

Redis高可用主从复制与哨兵模式

前言 在生产环境中&#xff0c;除了采用持久化方式实现 Redis 的高可用性&#xff0c;还可以采用主从复制、哨兵模式和 Cluster 集群的方法确保数据的持久性和可靠性。 目录 一、主从复制 1. 概述 2. 作用 3. 主从复制流程 4. 部署 4.1 安装 redis 4.2 编辑 master 节…

Xxxxxx

数据库 1&#xff0c;B树与B树区别 1&#xff0c;B树每个节点存ID与其他数据字段&#xff0c;B非叶子结点&#xff0c;只存ID&#xff0c;叶子结点存完整数据 好处&#xff1a;每个层级B树&#xff0c;可以存储更多的额数据&#xff0c;层级更少&#xff0c;更扁平&#xff…

代码块的理解

如果成员变量想要初始化的值不是一个硬编码的常量值&#xff0c;而是需要通过复杂的计算或读取文件、或读取运行环境信息等方式才能获取的一些值&#xff0c;该怎么办呢&#xff1f;此时&#xff0c;可以考虑代码块&#xff08;或初始化块&#xff09;。 代码块(或初始化块)的作…

【Linux】IO多路转接

文章目录 一、selectselect函数select基本工作流程select的优缺点select的适用场景 二、pollpoll函数poll的优缺点 三、epollepoll相关系统调用epoll工作原理epoll的优点epoll工作方式对比LT和ET 一、select select是系统提供的一个多路转接接口。 select系统调用可以让我们的…

(echarts)vue中循环生成多个相同的echarts图表,但数据动态、第一次渲染失败问题

(echarts)vue中循环生成多个相同的echarts图表&#xff0c;但数据动态 效果&#xff1a; 代码&#xff1a; <!-- 动态图表 --> <el-row :gutter"20"><el-col v-for"(item,index) in echartsList" :key"index" :span"10&quo…

wordpress课程项目主题电脑版+手机版自适应

这款主题适合做资源、课程、素材等&#xff0c;演示站&#xff1a;点击查看

openwrt开发包含路由器基本功能的web问题记录

1.这里的扫描怎么实现的先找一些luci代码&#xff0c;在openwrt21版本后&#xff0c;luci用js替换了lua写后台&#xff0c;先找一些代码路径 在openrwt15这部分代码是在这个目录下 feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_join.htm 里面包含…

javaWeb旅游网站设计

一、概述 1.1 项目研究背景 社会经济的发展和提高潜移默化的影响了人们对精神消费的日益看中与提高&#xff0c;所以越来越多的人们开始选择更健康有趣的生活活动&#xff0c;随之而来的旅游便成了人们消费的必选。随着旅客需求的日趋丰富和个性化&#xff0c;这势必将推动我…

理解main方法的语法

由于JVM需要调用类的main()方法&#xff0c;所以该方法的访问权限必须是public&#xff0c;又因为JVM在执行main()方法时不必创建对象&#xff0c;所以该方法必须是static的&#xff0c;该方法接收一个String类型的数组参数&#xff0c;该数组中保存执行Java命令时传递给所运行…

【零基础C语言】编译和链接

1.翻译环境和运行环境 翻译环境&#xff1a;将源代码转化为可执行的机器指令 运行环境&#xff1a;用于执行机器指令 1.1 翻译环境 翻译环境由编译和链接两大过程构建&#xff0c;编译又可以分为三大过程&#xff1a; 【1】预处理(预编译) 【2】编译 【3】汇编 不同的.c文件经…

计算机网络_工具

从你的电脑到指定ip网站&#xff0c;用时3ms ttl TTL Time To Live 数据包存活时间 指一个数据包在经过一个路由器时&#xff0c;可传递的最长距离&#xff08;跃点数&#xff09;。每当数据包经过一个路由器时&#xff0c;其存活次数就会被减一 256 - 249 7&…

什么!Intel/AMD/Apple Silicon也能本地部署的Llama工具来了

主流的LLM都需要通过CUDA才能高效的运行在本地&#xff0c;但是随着Github上出现了Llama.cpp这个神器&#xff0c;一切都改变了。它通过AVX指令和MPI来实现CPU上并行计算&#xff0c;从而在本地计算机高效地运行各种主流的类Llama模型。同时它也支持metal&#xff0c;使得Apple…

Mybatis的SQL高级查询与各符号用法

test语句里面的logparam是Mapper层传入的参数&#xff0c;读取logparam的属性不用再用#{}符号表示。 如果需要计算的式子很长&#xff0c;那么可用${}表示里面的式子是计算式&#xff0c;需要进行计算操作。同样不用通过#{logparam.Page}来读取logparam的Page属性的值&#xff…

第19次修改了可删除可持久保存的前端html备忘录:换了一个特别的倒计时时钟

第19次修改了可删除可持久保存的前端html备忘录:换了一个特别的倒计时时钟 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><met…

合同约定的绩效奖金说不给就不给了, 这合法吗?

目录 一、北京海淀法院参考案例 二、关于绩效奖金的性质&#xff1f; 三、绩效奖金应否发放取决于哪些因素&#xff1f; 四、员工如何举证与质证 五、提前离职的员工 是否享受当年度绩效奖金&#xff1f; 一、北京海淀法院参考案例 https://mp.weixin.qq.com/s/sq0mFCC8M…