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

Leetcode Hot 100之四:283. 移动零+11. 盛最多水的容器

283.移动零

题目:

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:

输入: nums = [0]
输出: [0]

思路:

使用双指针i和j。第一遍遍历i从左到右遍历数组,遇到非零元素即赋值给j所在的位置。因为j的数量一方面等于非零元素的个数,另一方面等于最终形态数组的左边最后一个非零元素的下标-1。(相当于一个数组长度是4,最后一个元素的下标就是4-1,为3)
第二遍再从j下标开始遍历,一直到数组结尾,都赋值为0,即相当于从最终形态数组的左边最后一个非零元素的下一个,即零元素一直到数组结尾,都赋值为0.

java代码:

class Solution {public void moveZeroes(int[] nums) {int len=nums.length;if(nums == null||len==0) return;int j=0;for(int i=0;i<len;i++){if(nums[i]!=0){nums[j++]=nums[i];}}for(int i=j;i<len;i++)nums[i]=0;}
}

效率:

时间上为1ms,击败了99%的用户。不用再优化了。

11.盛最多水的容器

题目

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器。
在这里插入图片描述
n == height.length
2 <= n <= 10^5
0 <= height[i] <= 10^4

思路

暴力做法:从左到右遍历,每次都固定左边界,然后再从左边界开始遍历右边界。这样可以涵盖所有面积的情况。但是因为是双重循环,所以时间复杂度为O(N)。

双指针做法:针对这种两边边界都会移动的情况下,我们优化时首先需要考虑的就是双指针。暴力循环的做法,每次固定左边界,右边界移动,会让底和高同时变化。这样就让我们无法提前判断是否某些情况是无需遍历的,可以被优化的。基于此,我们要思考的就是如何移动,能只有一个因素影响面积。
我们发现,如果不是固定左边界,然后右边界从左边界处从左到右遍历。而是左右边界都各自放在坐标的左右边界,这样就确保了移动的过程中底是越来越小的,只有高变化时才有可能出现面积更大的可能。那么就只有一个因素影响面积。
接下来我们需要判断什么时候移动左边界,什么时候移动右边界。同理,我们只需要移动高度较小的那边。因为高度较小的那边限制了面积,只有移动他才有可能出现面积更大的情况。
这个题力扣官方讲解的很好,建议还是不明白的话去看下官方讲解视频。

java代码

class Solution {public int maxArea(int[] height) {int len=height.length;int ans=0;int i=0;int j=len-1;while(j>i){int mmin=Math.min(height[i], height[j])*(j-i);ans=Math.max(ans, mmin);//考虑移动左指针还是右指针//如果左指针的高度比右指针小,那么此时移动左指针才有可能找到面积更大的区域if(height[i]<height[j]){//移动左指针i++;}else j--;}return ans;}
}

效率

4ms,击败 61.80%使用 Java 的用户,还行,没啥需要优化的空间了。

http://www.lryc.cn/news/224164.html

相关文章:

  • 景联文科技助力金融机构强化身份验证,提供高质量人像采集服务
  • Spring Cloud LoadBalancer基础知识
  • 剖析WPF模板机制的内部实现
  • 计算机网络常见的名词解释
  • Android Studio导入,删除第三方库
  • 生成指定长度的随机数字,用对方法精准提效数10倍!
  • Vue3 + Naive-ui Data Table 分页页码显示不全
  • 机器学习中的决策阈值
  • mongodb导出聚合查询的数据
  • U-Mail信创邮件系统解决方案
  • GUI:贪吃蛇
  • leaflet:个性化配置,利用Leaflet-Geoman绘制多种图形(136)
  • 【Shell脚本8】Shell printf 命令
  • CSAPP第4章:RISC和CISC指令集
  • 【LeetCode】每日一题 2023_11_9 逃离火灾(bfs 练习)
  • flink1.18.0 自适应调度器 资源弹性缩放 flink帮你决定并行度
  • 如何设计vue项目的权限管理?
  • HBase学习笔记(2)—— API使用
  • C/C++轻量级并发TCP服务器框架Zinx-游戏服务器开发004:游戏核心消息处理 - 玩家类的实现
  • Python Selenium元素定位方法详解
  • 分布式事务,你了解多少?(上)
  • ClickHouse主键索引最佳实践
  • Flink 基础 -- 应用开发(项目配置)
  • 空间曲面@常见曲面方程
  • unity 接收和发送Udp消息
  • 机器学习股票大数据量化分析与预测系统 - python 计算机竞赛
  • 架构描述语言(ADL)
  • GZ038 物联网应用开发赛题第2套
  • Go 接口:Go中最强大的魔法,接口应用模式或惯例介绍
  • Vue3全局共享数据