LeetCode Hot100 (普通数组)
53. 最大子数组和
简单的dp问题实际上,如果当前位置的前一个位置的和大于0我们直接加上,不大于就忽略即可
class Solution {public int maxSubArray(int[] nums) {int ans=-100000;int sum=ans;for(int i=0;i<nums.length;i++){sum=Math.max(sum+nums[i],nums[i]);ans=Math.max(ans,sum);}return ans;}
}
56. 合并区间
我们定义前一个为a,后面一个为b,进行排序之后(a小的在前面,其次b小的在前面),这样就成为了一个线段覆盖问题,就会出现三种情况,
1.当前线段被前一个包围(忽略即可)
2.当前线段与前一个交接了一部分(两条线段合并)
3.不包含(再起一段)
代码模拟即可
class Solution {public int[][] merge(int[][] intervals) {node [] arr=new node[intervals.length];for(int i=0;i<intervals.length;i++){arr[i]=new node();arr[i].a=intervals[i][0];arr[i].b=intervals[i][1];}Arrays.sort(arr);ArrayList<node> ans =new ArrayList<>();int l=arr[0].a;int r=arr[0].b;for(int i=1;i<intervals.length;i++){if(arr[i].b<=r){continue;}else if(arr[i].a<=r){r=arr[i].b;}else{node now=new node();now.a=l;now.b=r;ans.add(now);l=arr[i].a;r=arr[i].b;}}ans.add(new node(l,r));int [][]res =new int[ans.size()][2];for(int i=0;i<ans.size();i++){res[i][0]=ans.get(i).a;res[i][1]=ans.get(i).b;}return res;}public static class node implements Comparable<node>{int a,b;node(){a=0;b=0;};node(int a1,int b1){a=a1;b=b1;};@Overridepublic int compareTo(node o) {if(a!=o.a){return a-o.a;}return b-o.b;}}
}
189. 轮转数组
取余即可
class Solution {public static void rotate(int[] nums, int k) {int []ans=new int[nums.length];for(int i=0;i<nums.length;i++){int wei=(i+k)%nums.length;ans[wei]=nums[i];}for(int i=0;i<nums.length;i++){nums[i]=ans[i];}}
}
238. 除自身以外数组的乘积
简单的前缀和问题,我们记录当前位置前面的乘机,与当前位置后面的乘机即可,注意末尾和0位置应当为1
class Solution {public int[] productExceptSelf(int[] nums) {int []arr=new int[nums.length+2];int []brr=new int[nums.length+2];for(int i=0;i<nums.length;i++){arr[i+1]=nums[i];brr[i+1]=nums[i];}arr[0]=1;arr[nums.length+1]=1;brr[0]=1;brr[nums.length+1]=1;for(int i=1;i<=nums.length;i++){arr[i]=arr[i]*arr[i-1];}for(int i=nums.length;i>=1;i--){brr[i]=brr[i+1]*brr[i];}int []ans=new int[nums.length];for(int i=0;i<nums.length;i++){int wei=i+1;ans[i]=arr[wei-1]*brr[wei+1];}return ans;}
}
41. 缺失的第一个正数
不难发现,最大的正数也不会超过数组的长度,建立数组,一个一个放入即可
class Solution {public int firstMissingPositive(int[] nums) {int []brr=new int[nums.length+3];for(int i=0;i<nums.length ;i++){if(nums[i]>=0&&nums[i]<=nums.length){brr[nums[i]]++;}}for(int i=1;;i++){if(brr[i]==0){return i;}}}
}