283. 移动零
标记指针,当前位置为0向后面移动即可
class Solution {
public void moveZeroes(int[] nums) {
int l = 0;
for(int i=0;i<nums.length;i++){
if(nums[i]==0){
if(l<i){
l=i+1;
}
while(l<nums.length&&nums[l]==0) l++;
if(l<nums.length){
nums[i]=nums[l];
nums[l]=0;
l++;
}
}
}
String s=nums.toString();
System.out.println(s);
}
}
11.成最多水的容器
一个比较简单的做法,我们可以直接从高进行枚举,看看水会淹没到哪个位置,双指针左右移动即可
class Solution {
public int maxArea(int[] height) {
int maxx=0;
for(int i=0;i<height.length;i++){
maxx=Math.max(height[i],maxx);
}
int l=0;
int ans=0;
int r=height.length-1;
int n=r-1;
for(int i=1;i<=maxx;i++){
while(l<=n&&height[l]<i){
l++;
}
while(r>=0&&height[r]<i){
r--;
}
if(r<=l){
break;
}
ans=Math.max((r-l)*i,ans);
}
return ans;
}
}
15.三数之和
我们注意到数字不能有重复的,我们对数组进行排序之后,固定最左边位置的数字,然后枚举右边的两个数字即可,为了降低时间复杂度,双指针维护
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List< List<Integer> >res = new ArrayList<>();
Arrays.sort(nums);
// System.out.println(Arrays.toString(nums));
for(int i = 0; i < nums.length ; i++){
if(i>0){
if(nums[i]==nums[i-1]){
continue;
}
}
if(nums[i]>0){
continue;
}
int l=i+1;
int r=nums.length-1;
while(l<r){
while(l<=r&&nums[l]+nums[r]+nums[i]<0){
l++;
}
while(l<r&&nums[l]+nums[r]+nums[i]>0){
r--;
}
if(l>=r){
break;
}
if(nums[i]+nums[l]+nums[r]==0){
List<Integer>arr=List.of(nums[i],nums[l],nums[r]);
res.add(arr);
}
l++;
while(l<nums.length&&nums[l]==nums[l-1]){
l++;
}
}
}
return res;
}
}
42. 接雨水
最简单的困难题
实际上每一个点看看前面的最大值和后面的最大值,也就是那两个可以把他包围起来,然后两个最大值取个较小值就ok了
class Solution {
public int trap(int[] height) {
if(height.length==0){
return 0;
}
int []maxx1=new int[height.length+3];
int []maxx2=new int[height.length+3];
maxx1[0]=height[0];
for(int i=1;i<height.length;i++){
maxx1[i]=Math.max(maxx1[i-1],height[i]);
}
for(int i=height.length - 1;i>=0;i--){
maxx2[i]=Math.max(maxx2[i+1],height[i]);
}
int ans=0;
for(int i=1;i<height.length - 1;i++){
int f=ans;
ans=ans+Math.max(0,Math.min(maxx1[i-1],maxx2[i+1])-height[i]);
}
return ans;
}
}