
53. 最大子数组和 - 力扣LeetCode因为连续所以定义以i位置结尾的最大和。class Solution { public int maxSubArray(int[] nums) { int resnums[0]; int dp[]new int[nums.length]; dp[0]nums[0]; for(int i1;inums.length;i){ if(dp[i-1]0){ dp[i]nums[i]dp[i-1]; }else{ dp[i]nums[i]; } resMath.max(dp[i],res); } return res; } }56. 合并区间 - 力扣LeetCode先对区间按左边界排序考虑当前合并边界和next边界的交叉有哪些可能如果重合就继续合并下去不重合就把当前边界加入结果集合指向next最后要记得补充最后一个位置的数据。class Solution { public int[][] merge(int[][] intervals) { Arrays.sort(intervals, (a,b)-(a[0]-b[0])); int[] cur intervals[0]; Listint[] res new ArrayList(); for(int i 1 ; i intervals.length;i){ int []next intervals[i]; if(next[0]cur[1]){ cur new int[]{cur[0], Math.max(cur[1], next[1])}; }else{ res.add(cur); cur next; } } res.add(cur); return res.toArray(new int[res.size()][]); } }189. 轮转数组 - 力扣LeetCode备份值逻辑错误每次把当前值覆盖到next位置之前要保留next的值给下次覆盖用循环思路用count记录已处理元素个数可以自动处理任意圈数。任意位置cur保存当前的数据和位置计算出Next位置和值保存next的值temp用cur的值覆盖next位置cur位置换到next位置cur值改为tem的值一直到cur位置回到start位置停止。class Solution { public void rotate(int[] nums, int k) { // cur找到next的位置indexNext备份next的值tempNext k k % n; int count0; for(int startIndex0;count nums.length;startIndex){ int curIndex startIndex; int curvnums[startIndex]; do{ int nextIndex (curIndexk)%nums.length; int nextValuenums[nextIndex]; nums[nextIndex]curv; curIndexnextIndex; curvnextValue; count; }while(curIndex ! startIndex); } } }238. 除了自身以外数组的乘积 - 力扣LeetCode存储i位置的前缀乘积和后缀乘积为了避免多开启数组直接用res存储前缀再倒序整合后缀存入i位置res[i]先定义为从0到i-1的前缀乘积suffix定义为i1,n-1的后缀乘积class Solution { public int[] productExceptSelf(int[] nums) { int n nums.length; if(n0)return new int[]{}; int res[]new int[n]; res[0]1; for(int i 1;in;i){ res[i]res[i-1]*nums[i-1]; } int suffix1; for(int in-1;i0;i--){ res[i]*suffix; suffix*nums[i]; } return res; } }41. 缺失的第一个正数 - 力扣LeetCode原地哈希写错了好多遍注意返回值和死循环。1到n的值应该放在0到n-1遍历一遍每次循环把当前位置大于0小于等于n的数字交换到合适的位置同时避免重复数字无限交换的死循环最后返回的时候如果某个数字位置不对代表缺失返回i1如果都存在返回n1。class Solution { public int firstMissingPositive(int[] nums) { for(int i 0; i nums.length;i){ while(nums[i]0 nums[i] nums.length nums[nums[i] - 1] ! nums[i]){ swap(nums, i, nums[i]-1); } } for(int i0;inums.length;i){ if(nums[i]-1 ! i){ return i1; } } return nums.length1; } void swap(int a[], int i, int j){ int temp a[i]; a[i]a[j]; a[j]temp; } }