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

Hot100 Day02(移动0,乘最多水的容器、三数之和、接雨水)

移动零

题目链接
题目描述:
在这里插入图片描述

在这里插入图片描述

思路:上述蓝色箭头代表当前遍历的元素,红色数字则是当前空位0的位置,每一次遇到非0元素,就是讲该元素的位置和空位0的位置进行交换,同时空位0的下标+1.

代码

class Solution {public void moveZeroes(int[] nums) {int zeroIndex = 0 ;for(int i = 0 ; i < nums.length ; i++){if(nums[i] != 0){int tmp = nums[i];nums[i] = nums[zeroIndex];nums[zeroIndex] = tmp;zeroIndex++;}}}
}

盛水最多的容器

题目链接
题目描述:
在这里插入图片描述

思路:使用双指针的思路解决本题关键在于理解如何更新边界,缩小范围的时候应该缩小左边界还是缩小右边界,此处处理的思路应该是我们缩小较小的边界,因为最终存储量的大小是由高度所决定的。

代码

class Solution {public int maxArea(int[] height) {int res = 0;int left = 0;int right = height.length - 1;while (left < right) {int h = Math.min(height[left], height[right]);int w = right - left;res = Math.max(h * w, res);if (height[left] < height[right]) {left++;} else {right--;}}return res;}
}

三数之和

题目链接
题目描述:
在这里插入图片描述

思路: 遍历nums,当前下标为i的元素,与它的和为0的两个元素只可能在这个元素之后,因此,对这个元素之后的元素采用双指针来便利.(注意跳过重复的情况).

代码

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++){// 原始数据已经按照从大到小进行排序了,当当前下标的元素大于0,就没有必要继续检测了if(nums[i] > 0) return res;// 如果相邻的元素的值相同,那么他们查找出来的结果一定是重复的,所以要跳过.if(i > 0 && nums[i - 1] == nums[i])continue;int right = nums.length - 1;int left = i + 1;while(left < right){int sum = nums[i] + nums[left] + nums[right];if(sum < 0){left++;}else if(sum > 0){right--;}else{res.add(Arrays.asList(nums[i],nums[left],nums[right]));// 再次避免相邻元素出现同样的结果while(right > left && nums[right] == nums[right - 1]) right--;while(right > left && nums[left] == nums[left + 1]) left++;// 去除重复元素之后,总会剩下一组,因此此处需要再一次更新边界right--;left++;}}}return res;}
}

接雨水

题目链接
题目描述:
在这里插入图片描述

代码

双指针

力扣官方图片:
力扣官方图

class Solution {public int trap(int[] height) {int len  = height.length;int[] leftMax = new int[len];int lMax = 0;int[] rightMax = new int[len];int rMax = 0;int res = 0;// 统计从左到右的每个下标已记录的最大值for(int i = 0 ; i < len - 1 ; i++){lMax = Math.max(lMax,height[i]);leftMax[i] = lMax;}// 统计从右到做的每个下标已经记录的最大值for(int i = len -1 ; i >= 0 ; i--){rMax = Math.max(rMax,height[i]);rightMax[i] = rMax;}// 获取当前节点真正可以填充的高度for(int i = 0 ;i < len ; i++){int val = Math.min(leftMax[i],rightMax[i]) - height[i];if(val > 0)res += val;}return res;}
}

单调栈(待补充)


相关文章:

  • 区块链+AI融合实战:智能合约如何结合机器学习优化DeFi风控?
  • 2025年五一数学建模竞赛A题-支路车流量推测问题详细建模与源代码编写(一)
  • 守护生命律动:进行性核上性麻痹的专业健康护理指南
  • Python爬虫:trafilatura 的详细使用(快速提取正文和评论以及结构,转换为 TXT、CSV 和 XML)
  • SD卡通过读取bin文件替代读取图片格式文件来提高LCD显示速度
  • 34.2STM32下的can总线外设_csdn
  • GQA(Grouped Query Attention):分组注意力机制的原理与实践《三》
  • Linux 环境下 PPP 拨号的嵌入式开发实现
  • 网络可靠性的定义与核心要素
  • 用户 xxx is not in the sudoers file.
  • FEMFAT许可分析中的关键指标
  • CentOS在vmware局域网内搭建DHCP服务器【踩坑记录】
  • html2canvas v1.0.0-alpha.12版本文本重叠问题修复
  • qt+vs Generated File下的moc_和ui_文件丢失导致 error LNK2001
  • Unity安卓平台开发,启动app并传参
  • 使用 SseEmitter 实现 Spring Boot 后端的流式传输和前端的数据接收
  • 麒麟+ARM架构安装mysql8的操作指南
  • setting up Activiti BPMN Workflow Engine with Spring Boot
  • 霍夫曼编码详解
  • 2025Mybatis最新教程(三)
  • 网站备案有用/武汉百度百科
  • 美团是最早做团购的网站么/搭建网站多少钱
  • 厦门网站推广步骤机构/新闻热点
  • 网站建设策划报告/聚合搜索引擎入口
  • 做外汇模拟的网站/培训心得简短
  • 山东省住房城乡建设厅门户网站/百度指数是什么