zoukankan      html  css  js  c++  java
  • LeetCode: Tags-[Array], Difficulty-[Medium]

    Tags: Array

    Difficulty: Medium

    11. Container With Most Water: https://leetcode.com/problems/container-with-most-water/

    n条纵线,找出两条线使得容器最大:(题意:假设ai,aj  Cmax =min(ai,aj)*(j-i));

    暴力解法: (内外for循环; 外循环遍历, 内循环遍历i后的数, 嵌套求最值 max = Math.max(max,min([i],[j]))*(j-i) ps:LeetCode最后大数据TLE,LintCode可以通过)

     1 public class Solution {
     2     public int maxArea(int[] height) {
     3         int max = 0;
     4         for (int i = 0; i < height.length; i++) {
     5             for (int j = i; j < height.length; j++) {
     6                 max = Math.max(max,Math.min(height[j],height[i])*(j - i));
     7             }
     8         }
     9         return max;
    10     }
    11 }
    View Code

     解法2:<Two Pointers> (首尾双指针遍历 left,right, 记录max, 保留[left]/[right]中大的一个,另一边指针移动;)

    (0.int area; 1.left,right,max; 2.while(<=)max=max(,area); 3.if([left]<)left++);  (Q: 可以嵌套for循环的就可以双指针??Todo;)

     1 public class Solution {
     2     /**
     3      * @param heights: an array of integers
     4      * @return: an integer
     5      */
     6     int computeArea(int left, int right,  int[] heights) {
     7         return (right-left)*Math.min(heights[left], heights[right]);
     8     }
     9     
    10     public int maxArea(int[] heights) {
    11         // write your code here
    12         int left = 0, ans=  0 ; 
    13         int right = heights.length - 1;
    14         while(left <= right) {
    15             ans = Math.max(ans,computeArea(left, right, heights));
    16             if(heights[left]<=heights[right])
    17                 left++;
    18             else
    19                 right--;
    20         }
    21         return ans;
    22     }
    23 }
    View Code

    15. 3Sum: https://leetcode.com/problems/3sum/

    找出数组中所有3数之和为零的数:

    解法:(遍历,第一个数的相反数作为后两个数的和,二分遍历后两个数 1.排序 2.for(0,n-2)遍历 3.if(i=0 || [i]=[i-1]) 跳过重复元素  4.lo,high,sum  5.while(<)if等sum则add,while(<&&=)lo++,while(<&&=)hi--跳过重复元素; lo++ hi-- 搜索下一对2SUM;  6.if(<sum)那么lo++,else()hi--;  )

    (1.sort,rst; 2.for(n-2)if(0||!=);  3.lo=i+1,hi,sum; 4.while() if(=)tmp,add,while(<&=)++while(>&=)--; 5.if(<)++(>)-- 6.return;)

     1 public class Solution {
     2     public List<List<Integer>> threeSum(int[] nums) {
     3         Arrays.sort(nums);
     4         List<List<Integer>> rst = new ArrayList<List<Integer>>();
     5         for (int i = 0; i < nums.length - 2; i++) {
     6             if (i == 0 || (i > 0 && nums[i] != nums[i - 1])){
     7                 int lo = i + 1, hi = nums.length - 1, sum = 0 - nums[i];
     8                 while (lo < hi) {
     9                     if (nums[lo] + nums[hi] == sum) {
    10                         List<Integer> tmp = new ArrayList<Integer>();
    11                         tmp.add(nums[i]);
    12                         tmp.add(nums[lo]);
    13                         tmp.add(nums[hi]);
    14                         rst.add(tmp);
    15                         while (lo < hi && nums[lo] == nums[lo + 1]) lo++;
    16                         while (lo < hi && nums[hi] == nums[hi - 1]) hi--;
    17                         lo++; hi--;
    18                     } else if (nums[lo] + nums[hi] < sum) lo++;
    19                     else hi--;
    20                 }
    21             }
    22         }
    23         return rst;
    24     }
    25 }
    View Code
     1 public List<List<Integer>> threeSum(int[] num) {
     2     Arrays.sort(num);
     3     List<List<Integer>> res = new LinkedList<>(); 
     4     for (int i = 0; i < num.length-2; i++) {
     5         if (i == 0 || (i > 0 && num[i] != num[i-1])) {
     6             int lo = i+1, hi = num.length-1, sum = 0 - num[i];
     7             while (lo < hi) {
     8                 if (num[lo] + num[hi] == sum) {
     9                     res.add(Arrays.asList(num[i], num[lo], num[hi]));
    10                     while (lo < hi && num[lo] == num[lo+1]) lo++;
    11                     while (lo < hi && num[hi] == num[hi-1]) hi--;
    12                     lo++; hi--;
    13                 } else if (num[lo] + num[hi] < sum) lo++;
    14                 else hi--;
    15            }
    16         }
    17     }
    18     return res;
    19 }
    View Code

    16.3Sum Closest: https://leetcode.com/problems/3sum-closest/

    找出数组中三数之和最接近target,返回三数之和: 

    解法:(遍历第一个数,后两个数二分遍历,比较rst和遍历出的sum的与tar的差值大小;根据sum和tar的差值决定lo和hi的变化)(和我自己思路类似,但是我卡在了lo和hi的变化上,不能用lo++hi——,这样会导致有的组合被跳过 [a,b,c,d]->[a]+[d]->[b]+[c] 漏掉了ab,ac,bd,cd 所以应该根据sum和tar的大小关系确定lo和hi的变化;)(用到方法:Math.abs()取绝对值)

    (1.if()-1;  2.sort,rst;  3.for(n-2) if()lo,hi;  4.while()sum if(Math.abs<)rst=sum;  5.if()lo++;if()hi--  6.return;) (ps:while里的语句跳过重复,也可以不用)

     1 public class Solution {
     2     public int threeSumClosest(int[] nums, int target) {
     3         if (nums == null || nums.length < 3) {
     4             return -1;
     5         }
     6         Arrays.sort(nums);
     7         int rst = nums[0] + nums[1] + nums[2];
     8         for (int i = 0; i < nums.length - 2; i++) {
     9             if (i == 0 || (i > 0 && nums[i] != nums[i - 1])) {
    10                 int lo = i + 1, hi = nums.length - 1;
    11                 while (lo < hi){
    12                     int sum = nums[lo] + nums[hi] + nums[i];
    13                     if (Math.abs(rst - target) > Math.abs(sum - target))
    14                         rst = sum;
    15                     if (sum < target)
    16                         lo++;
    17                     else hi--;
    18                 }
    19             }
    20         }
    21         return rst;
    22     }
    23 }
    View Code

    18. 4Sum:https://leetcode.com/problems/4sum/

     我的解法:(与3SUM解法相同,两趟for循环遍历第一个值和第二个值,注意每趟遍历依然要去重!且每趟for循环的首位要保留;[00000] i=0,j=1去重时不能把j=1也去了)

    (1.rst,sort;  2.for(n-3)if(||&&); for(i+!,n-2)if(||&&);  3.lo,hi while();  4.if(=)tmp,add,while(&);  5.else if(<) else(>)  6.return;)

     1 public class Solution {
     2     public List<List<Integer>> fourSum(int[] nums, int target) {
     3         List<List<Integer>> rst = new ArrayList<List<Integer>>();
     4         Arrays.sort(nums);
     5         for (int i = 0; i < nums.length - 3; i++) {
     6             if (i == 0 || (i !=0 && nums[i] != nums[i - 1])){
     7                 for (int j = i + 1; j < nums.length - 2; j++) {
     8                     if (j == i + 1 || (j != i + 1 && nums[j] != nums[j - 1])){
     9                         int lo = j + 1, hi = nums.length - 1;
    10                         while (lo < hi) {
    11                             if (nums[lo] + nums[hi] + nums[i] + nums[j] == target) {
    12                                 List<Integer> tmp = new ArrayList<Integer>();
    13                                 tmp.add(nums[i]); tmp.add(nums[j]);
    14                                 tmp.add(nums[lo]); tmp.add(nums[hi]);
    15                                 rst.add(tmp);
    16                                 while (lo < hi && nums[lo] == nums[lo + 1]) lo++;
    17                                 while (lo < hi && nums[hi] == nums[hi - 1]) hi--;
    18                                 lo++; hi--;
    19                             } else if (nums[i] + nums[j] + nums[lo] + nums[hi] < target)
    20                                 lo++;
    21                             else hi --;
    22                         }
    23                     }
    24                 }
    25             }
    26         }
    27         return rst;
    28     }
    29 }
    View Code

    if也可以有其他写法:(continue)

     1 public class Solution {
     2     public List<List<Integer>> fourSum(int[] num, int target) {
     3         ArrayList<List<Integer>> ans = new ArrayList<>();
     4         if(num.length<4)return ans;
     5         Arrays.sort(num);
     6         for(int i=0; i<num.length-3; i++){
     7             if(i>0&&num[i]==num[i-1])continue;
     8             for(int j=i+1; j<num.length-2; j++){
     9                 if(j>i+1&&num[j]==num[j-1])continue;
    10                 int low=j+1, high=num.length-1;
    11                 while(low<high){
    12                     int sum=num[i]+num[j]+num[low]+num[high];
    13                     if(sum==target){
    14                         ans.add(Arrays.asList(num[i], num[j], num[low], num[high]));
    15                         while(low<high&&num[low]==num[low+1])low++;
    16                         while(low<high&&num[high]==num[high-1])high--;
    17                         low++;
    18                         high--;
    19                     }
    20                     else if(sum<target)low++;
    21                     else high--;
    22                 }
    23             }
    24         }
    25         return ans;
    26     }
    27 }
    View Code

    31. Next Permutation: https://leetcode.com/problems/next-permutation/

     找出下一个排列:[1,2,3,1]->[1,3,1,2]; [1,3,5,4,3,2,1]->[1,4,1,2,3,3,5]

    解法:(1.从后往前遍历,找到第一个不满足降序的i;  2.从后往前遍历 找出i后第一个比i大的数并swap;  3.将i后的数(已经是倒序)reverse反转;  这样能保证变化范围最小)

    (我的代码,有问题。。暂时没找到原因……)

    错!误!代!码!:原因swap(i,j)是按值传递,swap(nums[i],nums[j])后对数组没有变化;swap(int[] nums, int i, int j)是引用传递,将数组作为方法的参数,可以改变数组

     1 public class Solution {
     2     public void nextPermutation(int[] nums) {
     3         if (nums == null || nums.length == 0) {
     4             return;
     5         }
     6         int i = nums.length - 1;
     7         for (; i >= 1; i--) {
     8             if (nums[i] > nums[i - 1]) {
     9                 break;
    10             }
    11         }
    12         if (i != 0) {
    13             int j = nums.length - 1;
    14             for (; j >= i; j--) {
    15                 if (nums[j] > nums[i - 1]) {
    16                     swap(nums[i - 1],nums[j]);
    17                     break;
    18                 }
    19             }
    20         }
    21         reverse(nums,i);
    22     }
    23     void swap(int i,int j) {
    24         int tmp = i;
    25         i = j;
    26         j = tmp;
    27     }
    28     void reverse(int[] nums, int start) {
    29         int end = nums.length - 1;
    30         for (; start < end; start++,end--) {
    31             swap(nums[start],nums[end]);
    32         }
    33     }
    34 }
    View Code

    正确代码:(利用break记录指针最后的位置)

    (1.if;  2.i for(0)if()break;  3.if(!=)j,for(>=) if(i-1)swap break;  4.reverse(i);  5.swap([]),reverse([],start)) 

     1 public class Solution {
     2     public void nextPermutation(int[] nums) {
     3         if (nums == null || nums.length == 0) {
     4             return;
     5         }
     6         int i = nums.length - 1;
     7         for (; i > 0; i--) {
     8             if (nums[i] > nums[i - 1]) {
     9                 break;
    10             }
    11         }
    12         if (i != 0) {
    13             int j = nums.length - 1;
    14             for (; j >= i; j--) {
    15                 if (nums[j] > nums[i - 1]) {
    16                     swap(nums, i - 1, j);
    17                     break;
    18                 }
    19             }
    20         }
    21         reverse(nums, i);
    22     }
    23     void swap(int[] nums, int i, int j) {
    24         int tmp = nums[i];
    25         nums[i] = nums[j];
    26         nums[j] = tmp;
    27     }
    28     void reverse(int[] nums, int start) {
    29         int end = nums.length - 1;
    30         for (; start < end; start++,end--) {
    31             swap(nums,start,end);
    32         }
    33     }
    34 }
    View Code

    类似的:

     1 public class Solution {
     2     public void nextPermutation(int[] nums) {
     3         // find two adjacent elements, n[i-1] < n[i]
     4         int i = nums.length - 1;
     5         for (; i > 0; i --) {
     6             if (nums[i] > nums[i-1]) {
     7                 break;
     8             }
     9         }
    10         if (i != 0) {
    11             // swap (i-1, x), where x is index of the smallest number in [i, n)
    12             int x = nums.length - 1;
    13             for (; x >= i; x --) {
    14                 if (nums[x] > nums[i-1]) {
    15                     break;
    16                 }
    17             }
    18             swap(nums, i - 1, x);
    19         }
    20         reverse(nums, i, nums.length - 1);
    21     }
    22     
    23     void swap(int[] a, int i, int j) {
    24         int t = a[i];
    25         a[i] = a[j];
    26         a[j] = t;
    27     }
    28     // reverse a[i, j]
    29     void reverse(int[] a, int i, int j) {
    30         for (; i < j; i ++, j --) {
    31             swap(a, i, j);
    32         }
    33     }
    34 }
    View Code
     1 public class Solution {
     2     public void nextPermutation(int[] nums) {
     3       if(nums.length<=1){
     4           return;
     5       }
     6       
     7       int i= nums.length-1;
     8       
     9       for(;i>=1;i--){
    10          
    11          if(nums[i]>nums[i-1]){ //find first number which is smaller than it's after number
    12              break;
    13          }
    14       }
    15       
    16       if(i!=0){
    17           swap(nums,i-1); //if the number exist,which means that the nums not like{5,4,3,2,1}
    18       }
    19       
    20       reverse(nums,i);    
    21     }
    22     
    23     private void swap(int[] a,int i){
    24         for(int j = a.length-1;j>i;j--){
    25             if(a[j]>a[i]){
    26                 int t = a[j];
    27                 a[j] = a[i];
    28                 a[i] = t;
    29                 break;
    30             }
    31         }
    32     }
    33     
    34     private void reverse(int[] a,int i){//reverse the number after the number we have found
    35         int first = i;
    36         int last = a.length-1;
    37         while(first<last){
    38             int t = a[first];
    39             a[first] = a[last];
    40             a[last] = t;
    41             first ++;
    42             last --;
    43         }
    44     }
    45     
    46 }
    View Code

    34. Search for a Range: https://leetcode.com/problems/search-for-a-range/

    找出有序数组中tar的首尾位置:

    九章解法:(两次二分查找,注意while循环条件是start+1<end; 一般涉及范围问题、有重复值问题都应该用这个条件;对应的,下面的mid=start,end;并且要在最后判断边界值start和end。这样可以模板化,避免判断最终边界值start、mid、end混乱、错误的问题)

    (start,end,while(+1<)mid,mid  if([]=)else if([]=))

     1 public class Solution {
     2     public int[] searchRange(int[] A, int target) {
     3         if (A.length == 0) {
     4             return new int[]{-1, -1};
     5         }
     6         
     7         int start, end, mid;
     8         int[] bound = new int[2]; 
     9         
    10         // search for left bound
    11         start = 0; 
    12         end = A.length - 1;
    13         while (start + 1 < end) {
    14             mid = start + (end - start) / 2;
    15             if (A[mid] == target) {
    16                 end = mid;
    17             } else if (A[mid] < target) {
    18                 start = mid;
    19             } else {
    20                 end = mid;
    21             }
    22         }
    23         if (A[start] == target) {
    24             bound[0] = start;
    25         } else if (A[end] == target) {
    26             bound[0] = end;
    27         } else {
    28             bound[0] = bound[1] = -1;
    29             return bound;
    30         }
    31         
    32         // search for right bound
    33         start = 0;
    34         end = A.length - 1;
    35         while (start + 1 < end) {
    36             mid = start + (end - start) / 2;
    37             if (A[mid] == target) {
    38                 start = mid;
    39             } else if (A[mid] < target) {
    40                 start = mid;
    41             } else {
    42                 end = mid;
    43             }
    44         }
    45         if (A[end] == target) {
    46             bound[1] = end;
    47         } else if (A[start] == target) {
    48             bound[1] = start;
    49         } else {
    50             bound[0] = bound[1] = -1;
    51             return bound;
    52         }
    53         
    54         return bound;
    55     }
    56 }
    View Code

     我的解法:(第二次搜索从rst[0]开始,循环一直继续直到start和end都指向第一个tar)

    (1.rst if(0);  2.lo,hi,while(<=)mid,if(>=)mid-1,else mid+1;if(=)mid;  3.if(-1)return;  4.lo,hi,while()mid,if(<=)mid+1,else mid-1;if(=)mid;  5.return)

     1 public class Solution {
     2     public int[] searchRange(int[] A, int target) {
     3         int[] rst = new int[]{-1,-1};
     4         if (A.length == 0) {
     5             return rst;
     6         }
     7         int lo = 0, hi = A.length - 1;
     8         while (lo <= hi) {
     9             int mid = lo + (hi - lo) / 2;
    10             if (A[mid] >= target) {
    11                 hi = mid - 1;
    12             } else {
    13                 lo = mid + 1;
    14             }
    15             if (A[mid] == target) rst[0] = mid;
    16         }
    17         if (rst[0] == -1) {
    18             return rst;
    19         }
    20         lo = rst[0]; 
    21         hi = A.length - 1;
    22         while (lo <= hi) {
    23             int mid = lo + (hi - lo) / 2;
    24             if (A[mid] <= target) {
    25                 lo = mid + 1;
    26             } else {
    27                 hi = mid - 1;
    28             }
    29             if (A[mid] == target) rst[1] = mid;
    30         }
    31         return rst;
    32     }
    33 }
    View Code

    类似:

     1 public int[] searchRange(int[] nums, int target) {
     2     int[] result = new int[2];
     3     result[0] = findFirst(nums, target);
     4     result[1] = findLast(nums, target);
     5     return result;
     6 }
     7 
     8 private int findFirst(int[] nums, int target){
     9     int idx = -1;
    10     int start = 0;
    11     int end = nums.length - 1;
    12     while(start <= end){
    13         int mid = (start + end) / 2;
    14         if(nums[mid] >= target){
    15             end = mid - 1;
    16         }else{
    17             start = mid + 1;
    18         }
    19         if(nums[mid] == target) idx = mid;
    20     }
    21     return idx;
    22 }
    23 
    24 private int findLast(int[] nums, int target){
    25     int idx = -1;
    26     int start = 0;
    27     int end = nums.length - 1;
    28     while(start <= end){
    29         int mid = (start + end) / 2;
    30         if(nums[mid] <= target){
    31             start = mid + 1;
    32         }else{
    33             end = mid - 1;
    34         }
    35         if(nums[mid] == target) idx = mid;
    36     }
    37     return idx;
    38 }
    View Code

    35. Search Insert Position: https://leetcode.com/problems/search-insert-position/

    找出插入位置:

    我的解法:(二分查找,=的时候作为pos即为mid,>的时候-1,< +1,最后的mid 如果大于等于tar,那么pos就是mid,小于tar,pos就是mid+1)

    (1.lo,hi,rst,mid;  2.while(<=)if(=)return,if(>)-,if(<)+;  3.if([mid]>=)mid. else mid+1;  4.return)

     1 public class Solution {
     2     public int searchInsert(int[] nums, int target) {
     3         int lo = 0, hi = nums.length - 1;
     4         int rst = 0;
     5         int mid = 0;
     6         while (lo <= hi) {
     7             mid = lo + (hi - lo) / 2;
     8             if (nums[mid] == target) {
     9                 return mid;
    10             } else if (nums[mid] > target) {
    11                 hi = mid - 1;
    12             } else {
    13                 lo = mid + 1;
    14             }
    15         }
    16         if (nums[mid] >= target) {
    17             rst = mid;
    18         } else {
    19             rst = mid + 1;
    20         }
    21         return rst;
    22     }
    23 }
    View Code

    类似:(return low; low=mid/low=mid+1)

     1     public int searchInsert(int[] A, int target) {
     2         int low = 0, high = A.length-1;
     3         while(low<=high){
     4             int mid = (low+high)/2;
     5             if(A[mid] == target) return mid;
     6             else if(A[mid] > target) high = mid-1;
     7             else low = mid+1;
     8         }
     9         return low;
    10     }
    View Code

    39. Combination Sum: https://leetcode.com/problems/combination-sum/

    找出数组中所有相加可得到tar的组合(个数不限、使用次数不限):

    解法:(回溯法; target-index作为新的target从i处继续判断; 判断语句放在for外,则是target和0比较;注意递归参数是(tar-[i]和i))(PS:逻辑简单,刚开始参数搞错,结果就一直不对;要学会根据错误结果推断原因)

    (1.helper(nums,tar,rst,tmp,index)  2.if(0)rst.add,if(<)return;  3.for(index)add,helper(,tar-[i],rst,tmp,i),remove;  4.conbSum:sort,rst,tmp,helper,return)

     1 public class Solution {
     2     public List<List<Integer>> combinationSum(int[] candidates, int target) {
     3         List<List<Integer>> rst = new ArrayList<List<Integer>>();
     4         Arrays.sort(candidates);
     5         List<Integer> tmp = new ArrayList<Integer>();
     6         helper(candidates, target, rst, tmp, 0);
     7         return rst;
     8     }
     9     public void helper(int[] nums, int target, List<List<Integer>> rst, List<Integer> tmp, int index){
    10         if (target == 0) {
    11             rst.add(new ArrayList<Integer>(tmp));
    12             return;
    13         }
    14         if (target < 0) {
    15             return;
    16         }
    17         for (int i = index; i < nums.length; i++) {
    18             tmp.add(nums[i]);
    19             helper(nums, target - nums[i], rst, tmp, i);
    20             tmp.remove(tmp.size() - 1);
    21         }
    22     }
    23 }
    View Code

    40. Combination Sum II: https://leetcode.com/problems/combination-sum-ii/

    含重复数组找出和为tar的组合(个数不限,只能使用一次):

    我的解法:(与Combination Sum的解法相同; 区别:1.回溯时要把指针后移一位i+1;  2.遍历时要跳重,只能使用每轮遍历重复数字的第一个(i=index || [i]!=[i-1])

    (1.helper(nums,tar,rst,tmp,index)  2.if(0)rst.add,if(<)return;  3.for(index) if(||&&),add helper(,tar-[i],rst,tmp,i+1),remove;  4.cSum:sort,rst,tmp,help,retu)

     1 public class Solution {
     2     public List<List<Integer>> combinationSum2(int[] candidates, int target) {
     3         Arrays.sort(candidates);
     4         List<List<Integer>> rst = new ArrayList<>();
     5         List<Integer> tmp = new ArrayList<>();
     6         helper(candidates, target, rst, tmp, 0);
     7         return rst;
     8     }
     9     public void helper(int[] nums, int target, List<List<Integer>> rst, List<Integer> tmp, int index) {
    10         if (target == 0) {
    11             rst.add(new ArrayList<Integer>(tmp));
    12             return;
    13         }
    14         if (target < 0) {
    15             return;
    16         }
    17         for (int i = index; i < nums.length; i++) {
    18             if (i == index || (i != index && nums[i] != nums[i - 1])) {
    19                 tmp.add(nums[i]);
    20                 helper(nums, target - nums[i], rst, tmp, i + 1);
    21                 tmp.remove(tmp.size() - 1);
    22             }
    23         }
    24     }
    25 }
    View Code

    48. Rotate Image: https://leetcode.com/problems/rotate-image/

    顺时针九十度旋转二维矩阵: (todo)

     1 public class Solution {
     2     public void rotate(int[][] matrix) {
     3         for(int i = 0; i<matrix.length; i++){
     4             for(int j = i; j<matrix[0].length; j++){
     5                 int temp = 0;
     6                 temp = matrix[i][j];
     7                 matrix[i][j] = matrix[j][i];
     8                 matrix[j][i] = temp;
     9             }
    10         }
    11         for(int i =0 ; i<matrix.length; i++){
    12             for(int j = 0; j<matrix.length/2; j++){
    13                 int temp = 0;
    14                 temp = matrix[i][j];
    15                 matrix[i][j] = matrix[i][matrix.length-1-j];
    16                 matrix[i][matrix.length-1-j] = temp;
    17             }
    18         }
    19     }
    20 }
    View Code
     1 public class Solution {
     2     public void rotate(int[][] matrix) {
     3         if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
     4             return;
     5         }
     6 
     7         int length = matrix.length;
     8 
     9         for (int i = 0; i < length / 2; i++) {
    10             for (int j = 0; j < (length + 1) / 2; j++){
    11                 int tmp = matrix[i][j];
    12                 matrix[i][j] = matrix[length - j - 1][i];
    13                 matrix[length -j - 1][i] = matrix[length - i - 1][length - j - 1];
    14                 matrix[length - i - 1][length - j - 1] = matrix[j][length - i - 1];
    15                 matrix[j][length - i - 1] = tmp;
    16             }
    17         }   
    18     }
    19 }
    View Code

    53. Maximum Subarray: https://leetcode.com/problems/maximum-subarray/

     连续子数组的最大和: 

    解法:(动态规划?)(A[i]前的 Sum<0, 那么就从A[i]作为新的起始点; Sum>0, 那么比较Sum+A[i]和max的大小)(很乱……)

    (maxSoFar,maxEndingHere)

    1 public static int maxSubArray(int[] A) {
    2     int maxSoFar=A[0], maxEndingHere=A[0];
    3     for (int i=1;i<A.length;++i){
    4         maxEndingHere= Math.max(maxEndingHere+A[i],A[i]);
    5         maxSoFar=Math.max(maxSoFar, maxEndingHere);    
    6     }
    7     return maxSoFar;
    8 }
    View Code
     1 public class Solution {
     2     public int maxSubArray(int[] A) {
     3         if (A == null || A.length == 0){
     4             return 0;
     5         }
     6         
     7         int max = Integer.MIN_VALUE, sum = 0;
     8         for (int i = 0; i < A.length; i++) {
     9             sum += A[i];
    10             max = Math.max(max, sum);
    11             sum = Math.max(sum, 0);
    12         }
    13 
    14         return max;
    15     }
    16 }
    View Code

    54.Spiral Matrix: https://leetcode.com/problems/spiral-matrix/

    返回矩阵的螺旋顺序:

    解法:(画出矩阵图, 第一趟为[00]-[0n], [1n]-[mn], [m,n-1]-[m0], [m-1,0]-[1,0]; 第二趟,左右边界各加1,用count计数; 判断只剩一行或一列的break)

    (1.rst,if();  2.rows,cols,count;  3.while(*2<) for for if(==1) for for, count++;  4.return rst;)

     1 public class Solution {
     2     public List<Integer> spiralOrder(int[][] matrix) {
     3         List<Integer> rst = new ArrayList<>();
     4         if (matrix == null || matrix.length == 0)
     5             return rst;
     6         int rows = matrix.length;
     7         int cols = matrix[0].length;
     8         int count = 0;
     9         while (count * 2 < rows && count * 2 < cols) {
    10             for (int i = count; i < cols - count; i++) {
    11                 rst.add(matrix[count][i]);
    12             }
    13             for (int i = count + 1; i < rows - count; i++) {
    14                 rst.add(matrix[i][cols - count - 1]);
    15             }
    16             
    17             if (rows - 2 * count == 1 || cols - 2 * count == 1)
    18                 break;
    19             
    20             for (int i = cols - count - 2; i >= count; i--) {
    21                 rst.add(matrix[rows - count - 1][i]);
    22             }
    23             for (int i = rows - count - 2; i >= count + 1; i--) {
    24                 rst.add(matrix[i][count]);
    25             }
    26             count++;
    27         }
    28         return rst;
    29     }
    30 }
    View Code

    55. Jump Game:https://leetcode.com/problems/jump-game/

    步数不大于值从开始跳到结尾:

     解法1:DP动态规划 (定义数组boolean[] can, 对于数组中任意i,true的条件是存在j<i满足can[j]=true且j+a[j]<=i;所以需要遍历i之前的所有值; O(n^2))(大数据TLE)

    (1.if();  2.[]can,[0];  3.for(0,n-1)for(0,i) if(&&)[i];  4.return [n-1];)

     1 public class Solution {
     2     public boolean canJump(int[] nums) {
     3         if (nums == null || nums.length == 0) {
     4             return true;
     5         }
     6         boolean[] can = new boolean[nums.length];
     7         can[0] = true;
     8         for (int i = 0; i < nums.length; i++) {
     9             for (int j = 0; j < i; j++) {
    10                 if (can[j] && j + nums[j] >= i) {
    11                     can[i] = true;
    12                 }
    13             }
    14         }
    15         return can[nums.length - 1];
    16     }
    17 }
    View Code

    解法2:Greedy--根据已知条件得出局部最优解 (0-farthest-a[0];遍历数组,如果i在far范围内,那么far=max(far,a[i]+i); 最后判断far和n-1;)

     1 public class Solution {
     2     public boolean canJump(int[] nums) {
     3         if (nums == null || nums.length == 0) {
     4             return true;
     5         }
     6         int farthest = nums[0];
     7         for (int i = 1; i < nums.length; i++) {
     8             if (farthest >= i ) 
     9                 farthest = Math.max(farthest, i + nums[i]);
    10         }
    11         return farthest >= nums.length - 1;
    12     }
    13 }
    View Code
     1 public class Solution {
     2     public boolean canJump(int[] A) {
     3         // think it as merging n intervals
     4         if (A == null || A.length == 0) {
     5             return false;
     6         }
     7         int farthest = A[0];
     8         for (int i = 1; i < A.length; i++) {
     9             if (i <= farthest && A[i] + i >= farthest) {
    10                 farthest = A[i] + i;
    11             }
    12         }
    13         return farthest >= A.length - 1;
    14     }
    15 }
    View Code

    59. Spiral Matrix II: https://leetcode.com/problems/spiral-matrix-ii/

     平方螺旋矩阵:

    我的解法:(与Spiral Matrix解法相同, 区别是rows和cols都是n, 定义count计数四边已经铺了数字的边框,定义num++;对四边分别for循环赋值, 内部与最外圈的区别就是多了一个count,包括起始条件+/-count, 终止条件+/-count; 前两个for顺序遍历, 中间插入判断条件break, 后两个for倒序;)

    (1.int[][],num,count;  2.while(*2<) for for if() for for;  3.return)

     1 public class Solution {
     2     public int[][] generateMatrix(int n) {
     3         int[][] Matrix = new int[n][n];
     4         int count = 0;
     5         int num = 1;
     6         while (count * 2 < n) {
     7             for (int i = count; i < n - count; i++) {
     8                 Matrix[count][i] = num++;
     9             }
    10             for (int i = count + 1; i < n - count; i++) {
    11                 Matrix[i][n - count - 1] = num++;
    12             }
    13             
    14             if (count * 2 == n - 1) break;
    15             
    16             for (int i = n - count - 2; i >= count; i--) {
    17                 Matrix[n - count - 1][i] = num++;
    18             }
    19             for (int i = n - count - 2; i >= count + 1; i--) {
    20                 Matrix[i][count] = num++;
    21             }
    22             count++;
    23         }
    24         return Matrix;
    25     }
    26 }
    View Code

    类似:(不定义count, 直接用n-2作为变化, 判断条件为n>0; 不过重复定义了xStart,yStart; 其实方法一样……)

     1 public class Solution {
     2     public int[][] generateMatrix(int n) {
     3         if (n < 0) {
     4             return null;
     5         }
     6 
     7         int[][] result = new int[n][n];
     8 
     9         int xStart = 0;
    10         int yStart = 0;
    11         int num = 1;
    12 
    13         while (n > 0) {
    14             if (n == 1) {
    15                 result[yStart][xStart] = num++;
    16                 break;
    17             }
    18 
    19             for (int i = 0; i < n - 1; i++) {
    20                 result[yStart][xStart + i] = num++;
    21             }
    22 
    23             for (int i = 0; i < n - 1; i++) {
    24                 result[yStart + i][xStart + n - 1] = num++;
    25             }
    26 
    27             for (int i = 0; i < n - 1; i++) {
    28                 result[yStart + n - 1][xStart + n - 1 - i] = num++;
    29             }
    30 
    31             for (int i = 0; i < n - 1; i++) {
    32                 result[yStart + n - 1 - i][xStart] = num++;
    33             }
    34 
    35             xStart++;
    36             yStart++;
    37             n = n - 2;
    38         }
    39 
    40         return result;
    41     }
    42 }
    View Code

    62. Unique Paths: https://leetcode.com/problems/unique-paths/

     网格首尾的所有可能路径:

     Wrong!典型TLE解法:递归

    1 public class Solution {
    2     public int uniquePaths(int m, int n) {
    3         if (m == 1 || n == 1) return 1;
    4         return (uniquePaths(m - 1, n) + uniquePaths(m, n - 1));
    5     }
    6 }
    View Code

    解法:(for循环;第一列和第一行上的所有数sum为1,对于[i][j], 有递推关系sum=[i-1][j]+[i][j-1], return[m-1][n-1]) (Q: 所有递归均能改成for循环遍历+递推?)

    (1.sum[][];  2.for[i][0] for[0][i]; 3.for()for()[i][j];  4.return[-1][-1])

     1 public class Solution {
     2     public int uniquePaths(int m, int n) {
     3         int[][] sum = new int[m][n];
     4         for (int i = 0; i < m ; i++) {
     5             sum[i][0] = 1;
     6         }
     7         for (int i = 0; i < n; i++) {
     8             sum[0][i] = 1;
     9         }
    10         for (int i = 1; i < m; i++) {
    11             for (int j = 1; j < n; j++) {
    12                 sum[i][j] = sum[i - 1][j] + sum[i][j - 1];
    13             }
    14         }
    15         return sum[m - 1][n - 1];
    16     }
    17 }
    View Code

    63. Unique Paths II: https://leetcode.com/problems/unique-paths-ii/

    有障碍的网格的所有可能路径:

    我的解法: (类似U Paths, 区别:对于第一行和第一列,如果在[i][0]出现1,那么i上的sum为1,i下的sum为零;用递推关系sum[i][0] = sum[i-1][0]来表示, 当存在a[i][0]为1时,则sum[i][0]=0,后面依然用递推关系……(这段似乎可以用指针优化,一旦发现第一个1,就把后面的sum都置零?); 其次 对于[i][j]区别就是多一个判断条件,如果a[i][j]=1,那么sum[i][j]=0)

    (1.m,n,int,if,sum;  2.for(1,m)if(0)[i][0]=[i-1][0] else[i][0]=0; for(1,n);  3.for(1,m)(1,n)if(1)0 else[i][j]=[i-1][j]+[i][j-1];  4.return)

     1 public class Solution {
     2     public int uniquePathsWithObstacles(int[][] obstacleGrid) {
     3         int m = obstacleGrid.length;
     4         int n = obstacleGrid[0].length;
     5         int[][] sum = new int [m][n];
     6         if (obstacleGrid[0][0] == 1) return 0;
     7         sum[0][0] = 1;
     8         for (int i = 1; i < m; i++) {
     9             if (obstacleGrid[i][0] == 0) 
    10                 sum[i][0] = sum[i - 1][0];
    11             else sum[i][0] = 0;
    12         }
    13         for (int i = 1; i < n; i++) {
    14             if (obstacleGrid[0][i] == 0)
    15                 sum[0][i] = sum[0][i - 1];
    16             else sum[0][i] = 0;
    17         }
    18         for (int i = 1; i < m; i++) {
    19             for (int j = 1; j < n; j++) {
    20                 if (obstacleGrid[i][j] == 1)
    21                     sum[i][j] = 0;
    22                 else
    23                     sum[i][j] = sum[i -1][j] + sum[i][j - 1];
    24             }
    25         }
    26         return sum[m - 1][n - 1];
    27     }
    28 }
    View Code

    类似: (第一行第一列遇到1后就break,其他基本相同)

     1 public class Solution {
     2     public int uniquePathsWithObstacles(int[][] obstacleGrid) {
     3         if (obstacleGrid == null || obstacleGrid.length == 0 || obstacleGrid[0].length == 0) {
     4             return 0;
     5         }
     6         
     7         int n = obstacleGrid.length;
     8         int m = obstacleGrid[0].length;
     9         int[][] paths = new int[n][m];
    10         
    11         for (int i = 0; i < n; i++) {
    12             if (obstacleGrid[i][0] != 1) {
    13                 paths[i][0] = 1;
    14             } else {
    15                 break;
    16             }
    17         }
    18         
    19         for (int i = 0; i < m; i++) {
    20             if (obstacleGrid[0][i] != 1) {
    21                 paths[0][i] = 1; 
    22             } else {
    23                 break;
    24             }
    25         }
    26         
    27         for (int i = 1; i < n; i++) {
    28             for (int j = 1; j < m; j++) {
    29                 if (obstacleGrid[i][j] != 1) {
    30                     paths[i][j] = paths[i - 1][j] + paths[i][j - 1];
    31                 } else {
    32                     paths[i][j] = 0;
    33                 }
    34             }
    35         }
    36         
    37         return paths[n - 1][m - 1];
    38     }
    39 }
    View Code

    64. Minimum Path Sum:https://leetcode.com/problems/minimum-path-sum/

     网格路径上元素和的最小值:

    我的解法:(类似U Paths 和UP II, 方法是动态规划/递推关系。对于grid[i][j], sum的值为sum[i-1][j]和sum[i][j-1]的小的值加上grid[i][j]; 其次对于第一行和第一列,sum就是[0][i-1]+grid[0][i]) (PS:Bug Free!! 一次AC!!)

     1 public class Solution {
     2     public int minPathSum(int[][] grid) {
     3         int m = grid.length;
     4         int n = grid[0].length;
     5         int[][] sum = new int[m][n];
     6         sum[0][0] = grid[0][0];
     7         for (int i = 1; i < m; i++) {
     8             sum[i][0] = sum[i - 1][0] + grid[i][0];
     9         }
    10         for (int i = 1; i < n; i++) {
    11             sum[0][i] = sum[0][i - 1] + grid[0][i];
    12         }
    13         for (int i = 1; i < m; i++) {
    14             for (int j = 1; j < n; j++) {
    15                 sum[i][j] = Math.min(sum[i - 1][j], sum[i][j - 1]) + grid[i][j];
    16             }
    17         }
    18         return sum[m - 1][n - 1];
    19     }
    20 }
    View Code

    73. Set Matrix Zeroes:https://leetcode.com/problems/set-matrix-zeroes/

     零所在的行和列都置零:

     解法1:(O(m+n)space, 初始化row[]和col[], if(matrix[i][j])等于零, 就将row[i]和col[j]置一; 遍历row,将为1的i行置零; 同理col;)

    (1.m,n,row,col;  2.for()for()if(=)1;  3.for()if()for()0; for()if()for()0; )

     1 public class Solution {
     2     public void setZeroes(int[][] matrix) {
     3         int m = matrix.length;
     4         int n = matrix[0].length;
     5         int[] row = new int[m];
     6         int[] col = new int[n];
     7         for (int i = 0; i < m; i++) {
     8             for (int j = 0; j < n; j++) {
     9                 if (matrix[i][j] == 0) {
    10                     row[i] = 1;
    11                     col[j] = 1;
    12                 }
    13             }
    14         }
    15         for (int i = 0; i < m; i++) {
    16             if (row[i] == 1) {
    17                 for (int j = 0; j < n; j++) {
    18                     matrix[i][j] = 0;
    19                 }
    20             }
    21         }
    22         for (int j = 0; j < n; j++) {
    23             if (col[j] == 1) {
    24                 for (int i = 0; i < m; i++) {
    25                     matrix[i][j] = 0;
    26                 }
    27             }
    28         }
    29 
    30     }
    31 }
    View Code

    解法2:(In place 用第一行和第一列作为标记;  从[1][1]后遍历, 如果[i][j]=0,  那么就标记对应的[i][0]和[0][j]=0; 但需要单独考虑row0和col0; 如果存在i=0或j=0时[i][j]=0,需要先暂时用fr和fc标记, 最后额外将first row或者first col置零)

     (1.m,n,fr,fc;  2.for()for()if(=) if()if() 0 0;  3.for(1)for(1)if(||)0;  4.if(fr) if(fc);)

     1 public class Solution {
     2     public void setZeroes(int[][] matrix) {
     3         int m = matrix.length;
     4         int n = matrix[0].length;
     5         boolean fr = false;
     6         boolean fc = false;
     7         for (int i = 0; i < m; i++) {
     8             for (int j = 0; j < n; j++) {
     9                 if (matrix[i][j] == 0) {
    10                     if (i == 0) fr = true;
    11                     if (j == 0) fc = true;
    12                     matrix[i][0] = 0;
    13                     matrix[0][j] = 0;
    14                 }
    15             }
    16         }
    17         for (int i = 1; i < m; i++) {
    18             for (int j = 1; j < n; j++) {
    19                 if (matrix[i][0] == 0 || matrix[0][j] == 0) {
    20                     matrix[i][j] = 0;
    21                 }
    22             }
    23         }
    24         if (fr) {
    25             for (int i = 0; i < n; i++) {
    26                 matrix[0][i] = 0;
    27             }
    28         }
    29         if (fc) {
    30             for (int i = 0; i < m; i++) {
    31                 matrix[i][0] = 0;
    32             }
    33         }
    34     }
    35 }
    View Code

    74. Search a 2D Matrix: https://leetcode.com/problems/search-a-2d-matrix/

    查找二维矩阵: (参考LintCode 1-30 里的T28)

    解法1: 暴力解法 (for)

     1 public class Solution {
     2     public boolean searchMatrix(int[][] matrix, int target) {
     3         int row = matrix.length;
     4         int col = matrix[0].length;
     5         for (int i = 0; i < row; i++) {
     6             for (int j = 0; j < col; j++) {
     7                 if (matrix[i][j] == target)
     8                     return true;
     9             }
    10         }
    11         return false;
    12     }
    13 }
    View Code

    解法2: 两次二分(第一次找到tarRow,防止遗漏while(+1<)+mid+if判断; 第二次while(<=)+ mid+1/-1;)

    (1.ifif;  2.start,end,row;  3.while(+1<)mid if(=)if(</>)mid;  4.if(<=)elseif(<=)else false;  5.while(<=)if eif e;  6.return false;)

    public class Solution {
        /**
         * @param matrix, a list of lists of integers
         * @param target, an integer
         * @return a boolean, indicate whether matrix contains target
         */
        public boolean searchMatrix(int[][] matrix, int target) {
            // write your code here
            if (matrix == null || matrix.length == 0){
                return false;
            }
            if (matrix[0] == null || matrix[0].length == 0){
                return false;
            }
            int start = 0;
            int end = matrix.length - 1;
            int row ;
            while (start + 1 < end) {
                int mid = start + (end - start)/2;
                if (matrix[mid][0] == target){
                    return true;
                } else if (matrix[mid][0] < target) {
                    start = mid ;
                } else {
                    end = mid ;
                }
            }
            if (matrix[end][0] <= target){
                row = end;
            } else if (matrix[start][0] <= target){
                row = start;
            } else {
                return false;
            }
         
            start = 0;
            end = matrix[0].length - 1;
            while (start <= end) {
                int mid = start + (end - start)/2;
                if (matrix[row][mid] == target){
                    return true;
                } else if (matrix[row][mid] < target) {
                    start = mid + 1;
                } else {
                    end = mid - 1;
                }
            }
            return false;
        }
    }
    View Code

    解法3:一次二分(把matrix看成数组, m*n-1; row=mid/col, col=mid%col;)

    (1.ifif;  2.row,col,start,end;  3.while(<=)mid num=[/][%], if()e if() e;  4.return false; )

     1 public class Solution {
     2     public boolean searchMatrix(int[][] matrix, int target) {
     3         if (matrix ==  null ||  matrix.length == 0) 
     4             return false;
     5         if (matrix[0] == null || matrix[0].length == 0) 
     6             return false;
     7         int row = matrix.length;
     8         int col = matrix[0].length;
     9         
    10         int start = 0, end = row * col - 1;
    11         while (start <= end) {
    12             int mid = start + (end - start) / 2;
    13             if (matrix[mid / col][mid % col] == target) {
    14                 return true;
    15             } else if (matrix[mid / col][mid % col] > target) {
    16                 end = mid - 1;
    17             } else
    18                 start = mid + 1;
    19         }
    20         return false;
    21     }
    22 }
    View Code

    75. Sort Colors: https://leetcode.com/problems/sort-colors/

     只含0,1,2的数组排序:

    解法1:计数 两趟for循环:

     1 public class Solution {
     2     public void sortColors(int[] nums) {
     3         int cnt0 = 0, cnt1 = 0;
     4         for (int i = 0; i < nums.length; i++) {
     5             if (nums[i] == 0)
     6                 cnt0++;
     7             else if (nums[i] == 1)
     8                 cnt1++;
     9         }
    10         for (int i = 0; i < nums.length; i++) {
    11             if (i < cnt0) 
    12                 nums[i] = 0;
    13             else if (i < cnt0 + cnt1)
    14                 nums[i] = 1;
    15             else nums[i] = 2;
    16         }
    17     }
    18 }
    View Code

    解法2:Two Pointers (左指针指向0的后一位, 右指针指向2的前一位, i遍历l;  如果遍历到[i]为0,交换pl和i,pr++,i++; 如果遍历到2,交换pr和i,pr--; 遍历到1,i++;)(注意:循环条件i<=pr; [i]=2时,swap后i不增;)

    (1.pl,pr,i;  2.for(<=)if()swap(++,++), if()++, if()swap(--);  3.swap)

     1 public class Solution {
     2     public void sortColors(int[] nums) {
     3         int pl = 0, pr = nums.length - 1;
     4         for (int i = 0; i <= pr;) {
     5             if (nums[i] == 0)
     6                 swap(nums, i++, pl++);
     7             else if (nums[i] == 1)
     8                 i++;
     9             else
    10                 swap(nums, i, pr--);
    11         }
    12     }
    13     public void swap (int[]a, int i, int j) {
    14         int tmp = a[i];
    15         a[i] = a[j];
    16         a[j] = tmp;
    17     }
    18 }
    View Code

    78. Subsets: https://leetcode.com/problems/subsets/

    数组的子集数组:(参考LintCode 1-30: T17)

    解法1:(1.rst,if();  2.tmp,helper,return;  3.helper(nums,rst,tmp,index), add, for(index) add,help(i+1),remove)

     1 public class Solution {
     2     public List<List<Integer>> subsets(int[] nums) {
     3         ArrayList<List<Integer>> rst = new ArrayList<List<Integer>>();
     4         if (nums.length == 0) {
     5             rst.add(new ArrayList<Integer>());
     6             return rst;
     7         }
     8         List<Integer> tmp = new ArrayList<Integer>();
     9         helper(nums, rst, tmp, 0);
    10         return rst;
    11     }
    12     public void helper(int[] nums, List<List<Integer>> rst, List<Integer> tmp, int index){
    13         rst.add(new ArrayList<Integer>(tmp));
    14         
    15         for (int i = index; i < nums.length; i++) {
    16             tmp.add(nums[i]);
    17             helper(nums, rst, tmp, i + 1);
    18             tmp.remove(tmp.size() - 1);
    19         }
    20     }
    21 }
    View Code

    解法2:位运算(用bit位来表示这一位的number要不要取,第一位有1,0即取和不取2种可能性。所以只要把0到N种可能都用bit位表示,再把它转化为数字集合,就可以了)

     1 class Solution {
     2     /**
     3      * @param S: A set of numbers.
     4      * @return: A list of lists. All valid subsets.
     5      */
     6     public ArrayList<ArrayList<Integer>> subsets(int[] nums) {
     7         ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
     8         int n = nums.length;
     9         Arrays.sort(nums);
    10         
    11         // 1 << n is 2^n
    12         // each subset equals to an binary integer between 0 .. 2^n - 1
    13         // 0 -> 000 -> []
    14         // 1 -> 001 -> [1]
    15         // 2 -> 010 -> [2]
    16         // ..
    17         // 7 -> 111 -> [1,2,3]
    18         for (int i = 0; i < (1 << n); i++) {
    19             ArrayList<Integer> subset = new ArrayList<Integer>();
    20             for (int j = 0; j < n; j++) {
    21                 // check whether the jth digit in i's binary representation is 1
    22                 if ((i & (1 << j)) != 0) {
    23                     subset.add(nums[j]);
    24                 }
    25             }
    26             result.add(subset);
    27         }
    28         
    29         return result;
    30     }
    31 }
    View Code

    79. Word Search:https://leetcode.com/problems/word-search/

     二维矩阵查找字符串(todo)

    80. Remove Duplicates from Sorted Array II: https://leetcode.com/problems/remove-duplicates-from-sorted-array-ii/

     解法:<Two Pointers> (index指向"新"数组的后一位, i指向原数组; 如果i所指的数num和index-2所指的数相同, 表面new Array里已经包含两个数了, 那么就跳过这个数;)

    (1.index;  2.for() if(<2||!=[index-2])=  3.return index;)

     1 public class Solution {
     2     public int removeDuplicates(int[] nums) {
     3         int index = 0;
     4         for (int i = 0; i < nums.length; i++) {
     5             if (i < 2 || nums[i] != nums[index - 2]) {
     6                 nums[index++] = nums[i];
     7             }
     8         }
     9         return index;
    10     }
    11 }
    View Code
     1 Remove Duplicates from Sorted Array(no duplicates) :
     2 
     3 public int removeDuplicates(int[] nums) {
     4     int i = 0;
     5     for(int n : nums)
     6         if(i < 1 || n > nums[i - 1]) 
     7             nums[i++] = n;
     8     return i;
     9 }
    10 Remove Duplicates from Sorted Array II (allow duplicates up to 2):
    11 
    12 public int removeDuplicates(int[] nums) {
    13    int i = 0;
    14    for (int n : nums)
    15       if (i < 2 || n > nums[i - 2])
    16          nums[i++] = n;
    17    return i;
    18 }
    View Code

    81. Search in Rotated Sorted Array II: https://leetcode.com/problems/search-in-rotated-sorted-array-ii/

     (todo)

    90. Subsets II: https://leetcode.com/problems/subsets-ii/

    含重复元素的子集:

     1 public class Solution {
     2     public List<List<Integer>> subsetsWithDup(int[] nums) {
     3         List<List<Integer>> rst = new ArrayList<>();
     4         if (nums.length == 0) {
     5             rst.add(new ArrayList<Integer>());
     6             return rst;
     7         }
     8         Arrays.sort(nums);
     9         List<Integer> tmp = new ArrayList<Integer>();
    10         helper(nums, rst, tmp, 0);
    11         return rst;
    12     }
    13     public void helper(int[] nums, List<List<Integer>> rst, List<Integer> tmp, int index) {
    14         rst.add(new ArrayList<Integer>(tmp));
    15         for (int i = index; i < nums.length; i++) {
    16             if (i == index || (i > index && nums[i] != nums[i - 1])){
    17                 tmp.add(nums[i]);
    18                 helper(nums, rst, tmp, i + 1);
    19                 tmp.remove(tmp.size() - 1);
    20             }
    21             
    22         }
    23     }
    24 }
    View Code
  • 相关阅读:
    实体ip 虚拟ip 固定ip 动态ip
    mysql数据库性能调优总结积累
    Java项目相关监控与调优
    线程锁与避免线程锁 线程锁检测
    在Eclipse中使用JUnit4进行单元测试(高级篇)
    MySQL性能优化的21条最佳经验【转】
    在Eclipse中使用JUnit4进行单元测试(中级篇)
    在Eclipse中使用JUnit4进行单元测试(初级篇)
    Windbg学习使用
    性能测试积累总结
  • 原文地址:https://www.cnblogs.com/buwenyuwu/p/6170503.html
Copyright © 2011-2022 走看看