算法题目总结-双指针

devtools/2025/1/21 17:31:19/

文章目录

    • 1.滑动窗口类型
        • 1.长度最小的子数组
          • 1.答案
          • 2.思路
        • 2.无重复字符的最长子串
          • 1.答案
          • 2.思路
    • 2.双指针类型
        • 1.盛最多水的容器
          • 1.答案
          • 2.思路
        • 2.三数之和
          • 1.答案
          • 2.思路

1.滑动窗口类型

1.长度最小的子数组
1.答案
package com.sunxiansheng.arithmetic.day10;/*** Description: 209. 长度最小的子数组** @Author sun* @Create 2025/1/15 10:53* @Version 1.0*/
public class t209 {public static int minSubArrayLen(int target, int[] nums) {// 窗口定义:窗口内的元素要小于targetint left = 0;int sum = 0;// 记录结果int res = Integer.MAX_VALUE;for (int right = 0; right < nums.length; right++) {// 求和sum += nums[right];// 当窗口不满足要求时,记录结果,移动左指针while (sum >= target) {res = Math.min(res, right - left + 1);sum -= nums[left];left++;}}return res == Integer.MAX_VALUE ? 0 : res;}
}
2.思路

窗口定义:窗口内的元素要小于target,当窗口不满足要求时,记录结果,移动左指针

2.无重复字符的最长子串
1.答案
package com.sunxiansheng.arithmetic.day10;import java.util.HashSet;
import java.util.Set;/*** Description: 3. 无重复字符的最长子串** @Author sun* @Create 2025/1/15 11:01* @Version 1.0*/
public class t3 {public static int lengthOfLongestSubstring(String s) {// 窗口定义:窗口内的元素不能重复int left = 0;// 窗口Set<Character> set = new HashSet<>();// 结果int res = 0;for (int right = 0; right < s.length(); right++) {// 判断是否重复boolean flag = set.contains(s.charAt(right));// 加入窗口set.add(s.charAt(right));// 计算结果res = Math.max(res, set.size());// 如果重复了if (flag) {// 只要左指针指向的元素不等于右指针指向的元素,就一直移动左指针while (s.charAt(left) != s.charAt(right)) {set.remove(s.charAt(left));left++;}// 到这里说明左指针指向了重复元素,再移动一次left ++;}}return res;}
}
2.思路

窗口定义:窗口内的元素不能重复,先判断一下是否重复了,然后加入窗口,计算结果,如果真的重复了,就一直滑动窗口,直到将重复的元素移除

2.双指针类型

1.盛最多水的容器
1.答案
package com.sunxiansheng.arithmetic.day11;/*** Description: 11. 盛最多水的容器** @Author sun* @Create 2025/1/16 09:57* @Version 1.0*/
public class t11 {public static int maxArea(int[] height) {int max = 0;// 双指针int left = 0, right = height.length - 1;while (left < right) {// 求水量max = Math.max(max, Math.min(height[left], height[right]) * (right - left));// 如果左边小于右边,左指针移动if (height[left] < height[right]) {left++;} else {// 其余情况,右指针向左移动right--;}}return max;}
}
2.思路

就是用两个指针指向两边,先求水量和最大值,然后哪边指针的height低就移动哪边的指针

2.三数之和
1.答案
package com.sunxiansheng.arithmetic.day11;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;/*** Description: 15. 三数之和** @Author sun* @Create 2025/1/16 10:02* @Version 1.0*/
public class t15 {public static List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> res = new ArrayList<>();// 先排序Arrays.sort(nums);// 一层遍历 + 双指针for (int i = 0; i < nums.length - 2; i++) {// 1.当前元素跟前一个元素相同时不考虑if (i > 0 && nums[i] == nums[i - 1]) {continue;}int left = i + 1;int right = nums.length - 1;while (left < right) {// 求和int sum = nums[i] + nums[left] + nums[right];if (sum == 0) {res.add(Arrays.asList(nums[i], nums[left], nums[right]));// 2.左右指针指向的下一个元素跟当前元素相同也不考虑while (left < right && nums[left] == nums[left + 1]) {left++;}while (left < right && nums[right] == nums[right - 1]) {right--;}left++;right--;} else if (sum < 0) {left++;} else {right--;}}}return res;}
}
2.思路

一次遍历加上双指针,然后有两个去重点,一个是遍历遇到相同元素时的去重,另一个是左右指针遇到相同元素的去重】


http://www.ppmy.cn/devtools/152388.html

相关文章

Leetcode 3429. Paint House IV

Leetcode 3429. Paint House IV 1. 解题思路2. 代码实现 题目链接&#xff1a;3429. Paint House IV 1. 解题思路 这一题解法上就是一个动态规划的思路&#xff0c;由于题目有两个限制条件&#xff0c;即相邻不可以同色&#xff0c;以及前后同位置不可以同色&#xff0c;因此…

[c]可变参数函数

#include <stdio.h> #include <stdarg.h> void logMessage(const char *pFormat, ...) { // 定义一个 va_list 类型的变量 args 用于存储参数信息 va_list args; // 初始化 args 指向第一个未命名参数 va_start(args, pFormat); //…

嵌入式知识点总结 C/C++ 专题提升(一)-关键字

针对于嵌入式软件杂乱的知识点总结起来&#xff0c;提供给读者学习复习对下述内容的强化。 目录 1.C语言宏中"#“和"##"的用法 1.1.(#)字符串化操作符 1.2.(##)符号连接操作符 2.关键字volatile有什么含意?并举出三个不同的例子? 2.1.并行设备的硬件寄存…

大模型学习笔记 - 第一期 - Milvus向量数据库

大模型学习笔记 - 向量数据库 目录 大模型学习笔记 - 向量数据库传统文字检索(无嵌入)面临的困境1. 用户和商户表述差异2. 不同语种的表述差异3. 不同背景下的音译表述差异 向量检索向量化服务 参考 传统文字检索(无嵌入)面临的困境 1. 用户和商户表述差异 ​ 如果商户维护了…

在 Web 应用中集成多种地图 API 的实现与管理

在 Web 开发中&#xff0c;集成地图服务是常见的需求之一&#xff0c;尤其是在需要定位、路线规划或展示地理信息的应用中。常见的地图 API 服务包括百度地图、谷歌地图和雅虎地图等。在这篇文章中&#xff0c;我们将深入探讨如何在 Web 应用中同时集成多个地图 API&#xff0c…

Windows电脑安装USB Redirector并实现内外网跨网USB共享通信访问

文章目录 前言1. 安装下载软件1.1 内网安装使用USB Redirector1.2 下载安装cpolar内网穿透 2. 完成USB Redirector服务端和客户端映射连接3. 设置固定的公网地址 前言 我们每天都在与各种智能设备打交道&#xff0c;从手机到电脑&#xff0c;再到各种外设&#xff0c;它们已经…

全自动化河道水位监测系统:实时传输与远程监控

全自动化河道水位监测系统是利用先进的自动化技术和智能化设备&#xff0c;实现河道水位的实时监测、数据采集、处理分析、传输与远程监控的一体化解决方案。该系统的设计目标是确保河道水位监测的精准性和及时性&#xff0c;为防洪抗旱、水资源管理及环境保护等提供科学的数据…

LeetCode hot 力扣100 LRU 缓存

splice 是 C STL 的 std::list 提供的一个成员函数&#xff0c;用于高效地将一个或多个元素从一个链表移动到另一个链表&#xff0c;或在同一链表内重新排列元素。它不涉及数据的拷贝&#xff0c;而是直接修改链表节点的指针&#xff0c;因此操作非常高效。splice 的功能splice…