当前位置: 首页 > news >正文

算法| ss 双指针

  • 11.盛水最多的容器
  • 15.三数之和
  • 26.删除有序数组中的重复项
  • 27.移除元素
  • 75.颜色分类
  • 88.合并两个有序数组
  • 167.两数之和2-输入有序数组
  • 581.最短无序连续子数组
  • 2486.追加字符以获得子序列

11.盛水最多的容器

/*** @param {number[]} height* @return {number}*/
// 思路
// 左0 右 n-1
// while left<right
// 计算宽度right-left
// 左边大: 右高乘以width  右--
// 右边大: 左高乘以width 左++
// 指针移动: 谁小谁移动
// 更新最大值
var maxArea = function (height) {let left = 0;let right = height.length - 1;let ans = 0;while (left < right) {let width = right - left;if (height[left] > height[right]) {val = width * height[right];ans = Math.max(ans, val);right -= 1;} else {val = width * height[left];ans = Math.max(ans, val);left += 1;}}console.log(ans);
};
maxArea([1, 8, 6, 2, 5, 4, 8, 3, 7]);
// 输入:[1,8,6,2,5,4,8,3,7]
// 输出:49

15.三数之和

/*** @param {number[]} nums* @return {number[][]}*/
// 思路
//  数组升序(很重要)
// 计算公式:  定个首元素  +  左元素 + 右元素 = 0
// for循环定义首元素
// while循环 变更左右指针, 确定左右元素
// total <0 left++  total> 0 rigth++
// total==0 更新结果, 并且剪枝 如果左==左+1  左++   右=右-1 右--
var threeSum = function (nums) {nums.sort((a, b) => a - b);let ans = [];for (let i = 0; i < nums.length; i++) {let startNum = nums[i];let left = i + 1;let right = nums.length - 1;if (startNum > 0) continue;if (i > 0 && startNum === nums[i - 1]) continue;while (left < right) {let total = startNum + nums[left] + nums[right];if (total < 0) {left += 1;} else if (total > 0) {right -= 1;} else {ans.push([startNum, nums[left], nums[right]]);// 剪枝避免重复元素while (left < right && nums[left] === nums[left + 1]) left += 1;while (left < right && nums[right] === nums[right - 1]) right -= 1;left += 1;right -= 1;}}}//   console.log("ans", ans);return ans;
};
// [ -4, -1, -1, 0, 1, 2 ]
threeSum([-1, 0, 1, 2, -1, -4]);// 输入:nums = [-1,0,1,2,-1,-4]
// 输出:[[-1,-1,2],[-1,0,1]]

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

/*** @param {number[]} nums* @return {number}*/
// 思路
// 双指针解法
// for循环 right从1开始
// 当left right对应的值不相等时, left递增1, 并且对应值赋值为right对应的值
var removeDuplicates = function (nums) {let left = 0;for (let right = 1; right < nums.length; right++) {if (nums[left] !== nums[right]) {left += 1;nums[left] = nums[right];}}console.log(left + 1);return left + 1;
};
removeDuplicates([0, 0, 1, 1, 1, 2, 2, 3, 3, 4]);

27.移除元素

/*** @param {number[]} nums* @param {number} val* @return {number}*/
// 思路
// 双指针解法
// for遍历数组
// 条件: 当遍历值不等于val时, 设置num[i]为遍历值,并指针右移
// 都是不利用任何api,只是更改数组下标的方式得到结果
var removeElement = function (nums, val) {let i = 0;for (let j = 0; j < nums.length; j++) {if (nums[j] !== val) {nums[i] = nums[j];i += 1;}}return i;
};
removeElement([3, 2, 2, 3], 3);
// nums = [3,2,2,3], val = 3

75.颜色分类

88.合并两个有序数组

/*** @param {number[]} nums1* @param {number} m* @param {number[]} nums2* @param {number} n* @return {void} Do not return anything, modify nums1 in-place instead.*/
// 思路
// 定义两个数组的尾指针
// whiile 循环比较尾指针值大小
// 分别填充比较后的数值, 指针左移
// for循环nums2  填充, 补充前面的数据(针对num2的长度比num1长)
var merge = function (nums1, m, nums2, n) {let firstPoint = m - 1;let secondPoint = n - 1;//   倒序 从尾部比较2个数组,填充, 指针左移while (firstPoint >= 0 && secondPoint >= 0) {if (nums1[firstPoint] > nums2[secondPoint]) {nums1[firstPoint + secondPoint + 1] = nums1[firstPoint];firstPoint -= 1;} else {nums1[firstPoint + secondPoint + 1] = nums2[secondPoint];secondPoint -= 1;}}//   num1比num2短的情况下if (secondPoint >= 0) {for (let i = 0; i < secondPoint; i++) {nums1[i] = nums2[i];}}
};// 输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
// 输出:[1,2,2,3,5,6]
// 解释:需要合并 [1,2,3] 和 [2,5,6] 。
// 合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。

167.两数之和2-输入有序数组

581. 最短无序连续子数组

/*** @param {number[]} nums* @return {number}*/
// 思路: 双指针解法
// while循环 从左 从右遍历 找到 left right边界
// for循环left right 找到其中的最大值 最小值
// 确定左右指针的最终位置, left比min小  max 比right小
// 更新结果 right-left -1var findUnsortedSubarray = function (nums) {let len = nums.length;let left = 0;let right = len - 1;while (left < len && nums[left] <= nums[left + 1]) left++;while (right >= 0 && nums[right - 1] <= nums[right]) right--;let min = Infinity;let max = -Infinity;for (let i = left; i <= right; i++) {min = Math.min(min, nums[i]);max = Math.max(max, nums[i]);}while (nums[left] > min) left--;while (nums[right] < max) right++;console.log(left, right);return left < right ? right - left - 1 : 0;
};
console.log(findUnsortedSubarray([2, 6, 4, 8, 10, 9, 15]));
console.log(findUnsortedSubarray([1, 3, 2, 2, 2]));
// 输入:nums = [2,6,4,8,10,9,15]
// 输出:5

2486. 追加字符以获得子序列

/*** @param {string} s* @param {string} t* @return {number}*/
// 思路
// 双指针解法
// 遍历字符串s , 如果s某个字符等于t的某个字符,则i++
// 更新结果n-i
var appendCharacters = function (s, t) {const n = t.length;let i = 0;for (let j = 0; j < s.length; j++) {if (s[j] === t[i]) {i++;}}console.log(n - i);return n - i;
};
appendCharacters("coaching", "coding");
// 输入:s = "coaching", t = "coding"
// 输出:4

相关文章:

  • CentOS7安装Tomcat
  • 如何在plesk面板安装域名付费SSL证书
  • 云原生架构(微服务、容器云、DevOps、不可变基础设施、声明式API、Serverless、Service Mesh)
  • 大语言模型中常见小模型LLM垂直领域应用微调数据集
  • C++20 semaphore(信号量) 详解
  • 摄影杂记一
  • MyBatis 解决上篇的参数绑定问题以及XML方式交互
  • Pytest教程:一文了解如何使用 pytest_runtest_makereport 修改 Pytest 测试报告内容
  • NIUSHOP完美运营版商城 虚拟商品全功能商城 全能商城小程序 智慧商城系统 全品类百货商城
  • DFS序列
  • 双击返回键,轻松处理 WebView 中的后退事件
  • vue3从精通到入门14:内置组件之KeepAlive
  • 在 Amazon Timestream 上通过时序数据机器学习进行预测分析
  • C#学习笔记 面试提要
  • spring rest
  • python3.6+scrapy+mysql 爬虫实战
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • Angular 2 DI - IoC DI - 1
  • CentOS 7 修改主机名
  • egg(89)--egg之redis的发布和订阅
  • JavaScript创建对象的四种方式
  • JWT究竟是什么呢?
  • SQLServer插入数据
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 《天龙八部3D》Unity技术方案揭秘
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (C语言)二分查找 超详细
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (二)丶RabbitMQ的六大核心
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (力扣)1314.矩阵区域和
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (三)c52学习之旅-点亮LED灯
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .dwp和.webpart的区别
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .net core使用ef 6
  • .net2005怎么读string形的xml,不是xml文件。
  • @PreAuthorize注解
  • [52PJ] Java面向对象笔记(转自52 1510988116)
  • [Angularjs]asp.net mvc+angularjs+web api单页应用之CRUD操作
  • [Avalon] Avalon中的Conditional Formatting.
  • [BUUCTF 2018]Online Tool
  • [BUUCTF]-PWN:[极客大挑战 2019]Not Bad解析
  • [BZOJ3757] 苹果树