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

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;}
}

单调栈(待补充)


http://www.xdnf.cn/news/11875.html

相关文章:

  • 还原Windows防火墙
  • 点评中是如何实现短信登录的
  • 【C++】AVL树的概念及实现(万字图文超详解)
  • 电路图识图基础知识-降压启动(十五)
  • Python数据可视化科技图表绘制系列教程(二)
  • java从azure中读取用户信息
  • Kafka入门- 基础命令操作指南
  • NBA名人堂之-查尔斯·巴克利|里克·巴里|罗伯特·帕里什|斯科蒂·皮蓬|戴夫·德布斯切尔
  • VC++制作连连看辅助经验分享
  • Preference 系统自带的偏好设置页面解析
  • android中的TextWatcher的应用
  • Android应用获取root权限,修改系统文件
  • CentOS搭建并配置Nexus3记录
  • 干货整理:电脑监控软件都有哪些,哪款好用( 六大好用监控电脑软件推荐)
  • gps wifi信号测试软件,搜星+WiFi+EMI 导航平板信号性能横评
  • vb与EXCEL的连接
  • 由于找不到d3dx9_39.dll,无法继续执行代码的5种解决方法
  • 串口数据转以太网
  • Java入门基础,Java知识点总结合集
  • 迅雷老版本下载地址
  • 【学术相关】最新整理!绝对不能错过的130个学术网站和26个科研工具
  • OA系统:一文读懂OA系统,内附优秀OA界面。
  • nginx配置文件特殊字符说明
  • python实现抖音上比较火的罗盘时钟
  • 逆向工程入门学习(FreeBuf)
  • 黑马程序员 JavaScript
  • Iocomp Crack和ProEssentials Crack
  • 百度竞价点击器_百度竞价如何屏蔽恶意点击
  • Windows 7 RC十大功能的详细介绍以及改进方法
  • 【推荐】10个网站分类目录提交地址