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;    // 滑动窗⼝起始位置,也就是指针2int 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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于java实现的沙县小吃点餐系统

开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclip…

WebKit简介

1、简介&#xff08;WebKit&#xff09; WebKit 是一个开源的浏览器引擎&#xff0c;最初由苹果公司基于KHTML&#xff08;K Desktop Environment的HTML渲染引擎&#xff09;开发&#xff0c;并广泛应用于Safari浏览器&#xff0c;后来也被其他多款浏览器和应用采用。WebKit负…

Python程序设计 魔法函数

1.魔法方法 Python中有一些特殊方法&#xff0c;它们允许我们的类和Python更好地集成。在标准库参考&#xff08;Standard Library Reference&#xff09;中&#xff0c;它们被称为魔法方法(Magic Methods)&#xff0c;是与Python的其他特性无缝集成的基础。 例如&#xff0c…

Redis高可用与持久化

目录 一、Redis高可用 二、Redis持久化 1、持久化的功能&#xff1a; 2、Redis 提供两种方式进行持久化&#xff1a; 三、RDB持久化 1、触发条件 1.手动触发 2.自动触发 3.其他自动触发机制 2、执行流程 3、启动时加载 四、AOF持久化 1、开启AOF 2、执行流程 1.…

vue3+elementPlus:实现数字滚动效果(用于大屏可视化)

自行封装注册一个公共组件 案例一&#xff1a; //成功案例&#xff1a; //NumberScroll.vue /* 数字滚动特效组件 NumberScroll */<template><span class"number-scroll-grow"><spanref"numberScroll":data-time"time"class&qu…

构建知识图谱的基石:理解本体和数据模型

构建知识图谱的基石&#xff1a;理解本体和数据模型 一、本体的基本概念 1. 定义与重要性 本体&#xff08;Ontology&#xff09;在计算机科学和信息科学中&#xff0c;尤其是在知识图谱领域&#xff0c;扮演着重要的角色。它提供了一种形式化的描述知识领域的方法&#xff0…

【SpringCloud】Config配置中心

Spring Cloud Config是一个集中的外部配置管理服务器&#xff0c;它支持从各种来源读取配置数据&#xff0c;如Git仓库、本地文件系统、数据库等&#xff0c;并为微服务应用提供统一的配置管理。通过使用Spring Cloud Config&#xff0c;你可以将应用程序的配置信息集中管理&am…

金融案例:构建高效统一的需求登记与管理方案

在金融行业数字化转型背景下&#xff0c;银行等金融机构面临着业务模式创新与数据应用的深度融合。业务上所需要的不再是单纯的数据&#xff0c;而是数据背后映射的业务趋势洞察&#xff0c;只有和业务相结合转化为业务度量指标&#xff0c;经过数据分析处理呈现为报表进行展示…

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

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

力扣(数组)找到所有数组中消失的数字

给你一个含 n 个整数的数组 nums &#xff0c;其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字&#xff0c;并以数组的形式返回结果。 示例 1&#xff1a; 输入&#xff1a;nums [4,3,2,7,8,2,3,1] 输出&#xff1a;[5,6]示例 2&am…

03 cookie session

文章目录 Cookie01.javaCookie02.javaCookieTestServletSessionServlet.java Cookie01.java package com.aistart.cookie;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.…

力扣 392. 判断子序列

题目来源&#xff1a;https://leetcode.cn/problems/is-subsequence/description/ C题解1&#xff1a;在t中按顺序一个一个寻找s的元素。 class Solution { public:bool isSubsequence(string s, string t) {bool flg false;int m s.size(), n t.size();if(m 0) return tr…

简化Java开发:深入理解Lombok注解

Lombok是一个Java库&#xff0c;它通过注解的方式自动化生成繁琐的Java代码&#xff0c;如getters、setters、构造函数等。这大大减少了样板代码&#xff0c;使代码更加简洁易读。本文将详细介绍Lombok中几个常用注解的使用方法和它们的作用。 引入Lombok 要在Java项目中使用…

离散数学【详解】-自学考试湖北,争取做到识字都能看懂。

回顾8年前&#xff0c;我记得我大学高数没复习&#xff0c;考了23分。 今天公司代码写完了&#xff0c;明天清明节&#xff0c;写篇文章磨磨时间。 我的文章&#xff0c;没有一篇不是磨时间能好好写出来的。 ----我 先列标题&#xff0c;比如h1,h2,这些内容。然后往里面填字&a…

面试题:RabbitMQ 消息队列中间件

1. 确保消息不丢失 生产者确认机制 确保生产者的消息能到达队列&#xff0c;如果报错可以先记录到日志中&#xff0c;再去修复数据持久化功能 确保消息未消费前在队列中不会丢失&#xff0c;其中的交换机、队列、和消息都要做持久化消费者确认机制 由spring确认消息处理成功后…

C语言终篇--基于epoll ET模式 的 非阻塞IO服务器模型

使用技术: 1 epoll事件驱动机制&#xff1a;使用epoll作为IO多路复用的技术&#xff0c;以高效地管理多个socket上的事件。 2 边缘触发&#xff08;Edge Triggered, ET&#xff09;模式&#xff1a;epoll事件以边缘触发模式运行&#xff0c;这要求代码必须负责消费所有可用的…

信奥赛一本通 【例4.2】天安门广场的面积

1.说明 天安门广场在北京市中心&#xff0c;它南北长880米&#xff0c;东西宽500米&#xff0c;试编一程序&#xff0c;计算天安门广场面积是多少平方米。 2.输入格式 无 3.输出格式 输出天安门广场面积。 4.输入数据 无5.输出数据 4400006.题目说明 本题主要考察c语言入门的…

HarmonyOS 应用开发之非线性容器

非线性容器实现能快速查找的数据结构&#xff0c;其底层通过hash或者红黑树实现&#xff0c;包括HashMap、HashSet、TreeMap、TreeSet、LightWeightMap、LightWeightSet、PlainArray七种。非线性容器中的key及value的类型均满足ECMA标准。 HashMap HashMap 可用来存储具有关联…

非线性SVM模型

通过5个条件判定一件事情是否会发生&#xff0c;5个条件对这件事情是否发生的影响力不同&#xff0c;计算每个条件对这件事情发生的影响力多大&#xff0c;写一个非线性SVM模型程序,最后打印5个条件分别的影响力。 示例一 在非线性支持向量机&#xff08;SVM&#xff09;模型中…

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

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