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

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.xdnf.cn/news/18644.html

相关文章:

  • PCB电路设计学习2 元件原理图封装的添加 手工设计元件封装
  • 大型前端项目如何实现css 隔离:利用浏览器原生的 Shadow DOM 完全隔离 DOM 结构与样式...
  • Linux 下的网络编程
  • 学习嵌入式的第二十四天——数据结构——队列和树
  • Git 提交除某个文件外的其他所有文件
  • 微信开发者工具:更改 AppID 失败
  • 嵌入式-EXTI的工作原理和按钮实验-Day19
  • 我从零开始学习C语言(13)- 循环语句 PART2
  • QT-窗口类部件
  • K8S高可用集群
  • K8s的相关知识总结
  • 如何理解面向过程和面向对象,举例说明一下?
  • Qt5 的跨平台开发详细讲解
  • 计算机毕设选题推荐 基于Spark的家庭能源消耗智能分析与可视化系统 基于机器学习的家庭能源消耗预测与可视化系统源码
  • 告别第三方流氓工具,如何实现纯净系统维护
  • DIC技术极端环境高温案例分享——从1600℃的锆合金力学性能测试到3000℃变形测试的DIC测量
  • 手机、电脑屏幕的显示坏点检测和成像原理
  • k8s----学习站点搭建
  • C++显示类型转换运算符static_cast使用指南
  • 贪吃蛇--C++实战项目(零基础)
  • 大模型微调:从理论到实践的全面指南
  • 【链表 - LeetCode】19. 删除链表的倒数第 N 个结点
  • Laravel 使用阿里云OSS S3 协议文件上传
  • Java多线程面试题二
  • Flask电影投票系统全解析
  • WPF控件随窗体大宽度高度改变而改变
  • 金融风控AI引擎:实时反欺诈系统的架构设计与实现
  • Rust 入门 注释和文档之 cargo doc (二十三)
  • AP服务发现PRS_SOMEIPSD_00255 的解析
  • 《WINDOWS 环境下32位汇编语言程序设计》第7章 图形操作(1)