这里记录刷hot100的思考过程详解,方便后续记忆复习。
题号283
283. 移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
具体题解
class Solution {
public void moveZeroes(int[] nums) {
int i=0,j=0;
while(j<=nums.length-1){
if(nums[j]!=0){
nums[i]=nums[j];
i++;
j++;
}else{
j++;
}
}
while(i<=nums.length-1){
nums[i]=0;
i++;
}
}
}
思路解析
用双指针,前一个指针去探路,如果不是0就放到后一个指针的位置上。遍历一轮后,后一个指针再遍历,把后面的数都变成0
必会知识
无
题号11
11. 盛最多水的容器
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
具体题解
class Solution {
public int maxArea(int[] height) {
int i=0,j=height.length-1;
int ans=0;
while(i<=j){
int max=(j-i)*Math.min(height[i],height[j]);
if(max>ans){
ans=max;
}
if(height[i]>height[j]){
j–;
}else{
i++;
}
}
return ans;
}
}
思路解析
前后双指针实现
必会知识
无
题号15
5. 三数之和
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
具体题解
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> ans=new ArrayList<>();
for(int i=0;i<nums.length;i++){
if(i>0&&nums[i]==nums[i-1]) continue;
int target=-nums[i];
int left=i+1,right=nums.length-1;
while(left<right){
if(target==(nums[left]+nums[right])){
List<Integer> tmp=new ArrayList<>();
tmp.add(nums[i]);tmp.add(nums[left]);tmp.add(nums[right]);
ans.add(tmp);
left++;
right–;
while(left<right&&nums[left]==nums[left-1]) left++;
while(left<right&&nums[right]==nums[right+1]) right–;
}else if(target<(nums[left]+nums[right])){
right–;
}else{
left++;
}
}
}
return ans;
}
}
思路解析
target=-nums[i]=nums[r]+nums[l]。也使用前后指针去找符合条件的数组,这里为了避免三元组重复进行了三次判断。
必会知识
Arrays.sort()
数组转集合(这里直接添加的)
题号42
42. 接雨水
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例 1:

具体题解
class Solution {
public int trap(int[] height) {
int len=height.length;
int[] a1=new int[len];
int[] a2=Arrays.copyOf(height,len);
int[] b1=new int[len];
int[] b2=Arrays.copyOf(height,len);
int max=0;
for(int right=0;right<len-1;right++){
if(a2[right]>a2[right+1]){
a1[right+1]=a2[right]-a2[right+1];
a2[right+1]=a2[right];
}
}
for(int l=len-1;l>0;l–){
if(b2[l]>b2[l-1]){
b1[l-1]=b2[l]-b2[l-1];
b2[l-1]=b2[l];
}
}
for(int i=0;i<len;i++){
max=Math.min(b1[i],a1[i])+max;
}
return max;
}
}
思路解析
前后指针遍历。通过两个数组从前后开始遍历,存每个位置下可能的雨水。最后神奇的是某位置的雨水就等于Math.min(数组a,数组b)。
必会知识
Arrays.copyOf(height,len)



