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

Day2--HOT100--283. 移动零,11. 盛最多水的容器,15. 三数之和

Day2–HOT100–283. 移动零,11. 盛最多水的容器,15. 三数之和

每日刷题系列。今天的题目是力扣HOT100题单。

双指针题目。

283. 移动零

思路【我】:

  1. 左指针指向第一个0
  2. 右指针从第一个0的下一个开始遍历到结尾。
    • 当0,跳过
    • 非0,和左指针交换。左指针++
class Solution {public void moveZeroes(int[] nums) {int n = nums.length;int left = n;// 左指针指向第一个0for (int i = 0; i < n; i++) {if (nums[i] == 0) {left = i;break;}}// 如果左指针不变,证明没有0,right指针大于n,不会进入这个循环// 右指针指向非0数,把左指针的0用右指针的值覆盖掉,右指针置为0for (int right = left + 1; right < n; right++) {if (nums[right] == 0) {continue;}nums[left++] = nums[right];nums[right] = 0;}}
}

思路【@灵艾山茶府】:

  1. 当右指针非0,交换左右指针,左指针++
    • 隐含着:当前期左指针和右指针都非0的时候,也会进行“交换”,其实当左右指针都是非0,两个指针是相等的,自己交换自己,不影响结果,多余的操作而已。
    • 当出现第一个0的时候,左右指针才会不相等。此时左指针指向的是0,右指针找到非0数,两者交换。
    • 循环这个过程到结尾。
  2. 思路更简洁了。但是对我来说,好像不能一下子想出来。
class Solution {public void moveZeroes(int[] nums) {int n = nums.length;int left = 0;for (int right = 0; right < n; right++) {if (nums[right] != 0) {// 交换 nums[right] 和 nums[left]int tmp = nums[right];nums[right] = nums[left];nums[left] = tmp;left++;}}}
}

11. 盛最多水的容器

思路:

class Solution {public int maxArea(int[] height) {int n = height.length;int left = 0;int right = n - 1;int res = Integer.MIN_VALUE;while (left < right) {// 面积=底边宽度*较小的高度int area = (right - left) * Math.min(height[left], height[right]);// 刷新最大值res = Math.max(res, area);// 那边值小移动哪一边,相等移动谁无所谓if (height[left] < height[right]) {left++;} else {right--;}}return res;}
}

15. 三数之和

思路【我】:

双指针法,其实也可以叫三指针法。因为i也算是一个指针了。

但因为左右指针是同一轮循环里面移动的,i算一层,left和right算一层,总共两层循环。

  1. 要对每个数进行去重。因为是排序过的,每次对比相邻的两个数就好。
class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> res = new ArrayList<>();// 排序数组Arrays.sort(nums);for (int i = 0; i < nums.length; i++) {// 已经排序过了,如果nums[i]>0,后面的两个元素也会大于0,就无法相加为零,代表循环结束,可以直接返回。if (nums[i] > 0) {break;}// 去重aif (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];// 当sum >0,证明数太大了,右指针左移。下同理if (sum > 0) {right--;} else if (sum < 0) {left++;} else if (sum == 0) {res.add(Arrays.asList(nums[i], nums[left], nums[right]));// 去重b和cwhile (left < right && nums[left] == nums[left + 1]) {left++;}while (left < right && nums[right] == nums[right - 1]) {right--;}left++;right--;}}}return res;}
}
http://www.dtcms.com/a/346366.html

相关文章:

  • 94. 城市间货物运输 I, Bellman_ford 算法, Bellman_ford 队列优化算法
  • 【Android】 连接wifi时,强制应用使用流量
  • 反射【Reflect】
  • 深入浅出【最小生成树】:Prim与Kruskal算法详解
  • 111、【OS】【Nuttx】【周边】效果呈现方案解析:-print0 选项
  • AQS模板方法
  • 使用 Google 开源 AI 工具 LangExtract 进行结构化信息抽取
  • 单片机---------WIFI模块
  • Seaborn数据可视化实战:Seaborn数据可视化入门-绘制统计图表与数据分析
  • Dify 从入门到精通(第 49/100 篇):Dify 的自动化测试
  • STM32 硬件I2C读写MPU6050
  • 【链表 - LeetCode】24. 两两交换链表中的节点
  • 纯手撸一个RAG
  • 黄飞对话小熊电器流程与IT负责人:企业数字化进阶与AI实践如何落地?
  • QIcon::actualSize的作用和用法
  • 2025/8/22 xxl-job速通
  • 解决 微信开发者工具 :下载基础库版本 2.31.0 失败
  • RAG和微调是什么?两者的区别?什么场景使用RAG或微调?判断依据是什么?
  • LINUX网络编程--网络的发展与通信
  • AI赋能环保精准治理:AI水质监测溯源快、空气质量预测施策准,守护生态新效能
  • 关于 java+gradle的弹窗多选应用app
  • 【GPT入门】第54课 量化位数与存储大小的影响
  • Java 面试题训练助手 Web 版本
  • 网络通信——UDP协议。
  • Kubernetes 1.28 集群部署指南(基于 Containerd 容器运行时)
  • 笔记:二叉树构建方法
  • 从“配置化思维”到“前端效率革命”:xiangjsoncraft 如何用 JSON 简化页面开发?
  • 【源码】MES系统:从下达计划、执行反馈、异常预警到过程控制的一整套执行中枢。
  • FastTracker:实时准确的视觉跟踪
  • 一键部署openGauss6.0.2轻量版单节点