Array

4月3号

1. 1 Two Sum  bugfree

    public int[] twoSum(int[] numbers, int target) {
    int[] result = new int[2];
    Map<Integer, Integer> map = new HashMap<Integer, Integer>();
    for (int i = 0; i < numbers.length; i++) {
        if (map.containsKey(target - numbers[i])) {
            result[1] = i + 1;
            result[0] = map.get(target - numbers[i]);
            return result;
        }
        map.put(numbers[i], i + 1);
    }
    return result;
    }
View Code

2. 4 Median of Two Sorted Array   找l 和  r  找 如第k/2过返回下 如1返回小  一半递归

public double findMedianSortedArrays(int[] A, int[] B) {
        int m = A.length, n = B.length;
        int l = (m + n + 1) / 2;
        int r = (m + n + 2) / 2;
        return (getkth(A, 0, B, 0, l) + getkth(A, 0, B, 0, r)) / 2.0;
    }

public double getkth(int[] A, int aStart, int[] B, int bStart, int k) {
    if (aStart > A.length - 1) return B[bStart + k - 1];            
    if (bStart > B.length - 1) return A[aStart + k - 1];                
    if (k == 1) return Math.min(A[aStart], B[bStart]);
    
    int aMid = Integer.MAX_VALUE, bMid = Integer.MAX_VALUE;
    if (aStart + k/2 - 1 < A.length) aMid = A[aStart + k/2 - 1]; 
    if (bStart + k/2 - 1 < B.length) bMid = B[bStart + k/2 - 1];        
    
    if (aMid < bMid) 
        return getkth(A, aStart + k/2, B, bStart,       k - k/2);// Check: aRight + bLeft 
    else 
        return getkth(A, aStart,       B, bStart + k/2, k - k/2);// Check: bRight + aLeft
}
View Code

3, 11 Container With Most Water  左右比较找最大

    public int maxArea(int[] height) {
        if (height == null || height.length == 0)
        {
            return 0;
        }
        int l = 0;
        int r = height.length - 1;
        int area = 0;
        while (l < r)
        {
            area = Math.max(area, Math.min(height[l], height[r]) * (r - l));
            if (height[l] < height[r])
            {
                l++;
            }
            else
            {
                r--;
            }
        }
        return area;
    }
View Code

4 15 3sum   转变2 sum  注意两处去重

 public List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums);
        List<List<Integer>> res = new LinkedList<>();
        for (int i = 0; i < nums.length - 2; i++)
        {
            if (i == 0 || (i > 0 && nums[i] != nums[i - 1]))
            {
                int l = i + 1, r = nums.length - 1, sum = -nums[i];
                while (l < r)
                {
                    if (nums[l] + nums[r] == sum)
                    {
                        res.add(Arrays.asList(nums[i], nums[l], nums[r]));
                        while (l < r && nums[l] == nums[l + 1]) l++;
                        while (l < r && nums[r] == nums[r - 1]) r--;
                        l++; r--;
                    }
                    else if (nums[l] + nums[r] > sum)
                    {
                        r--;
                    }
                    else
                    {
                        l++;
                    }
                }
            }
        }
        return res;
    }
View Code

 4 月 4号

5  16 3 Sum Closet

    public int threeSumClosest(int[] nums, int target) {
        int res = nums[0] + nums[1] + nums[nums.length - 1];
        Arrays.sort(nums);
        for (int i = 0; i < nums.length - 2; i++)
        {
            int l = i + 1, r = nums.length - 1;
            while(l < r)
            {
                int sum = nums[l] + nums[r] + nums[i];
                if (sum > target)
                {
                    r--;
                }
                else
                {
                    l++;
                }
                if (Math.abs(sum - target) < Math.abs(res - target))
                {
                    res = sum;
                }
            }
        }
        return res;
    }
View Code

6 18  4 Sum

    public List<List<Integer>> fourSum(int[] nums, int target) {
        ArrayList<List<Integer>> res = new ArrayList<>();
        if (nums == null || nums.length < 4)
        {
            return res;
        }
        Arrays.sort(nums);
        for (int i = 0; i < nums.length - 3; i++)
        {
            if (i > 0 && nums[i] == nums[i - 1])
            {
                continue;
            }
            for (int j = i + 1; j < nums.length - 2; j++)
            {
                if (j > i + 1 && nums[j] == nums[j - 1])
                {
                    continue;
                }
                int l = j + 1, r = nums.length - 1;
                while (l < r)
                {
                    int sum = nums[i] + nums[j] + nums[l] + nums[r];
                    if (sum == target)
                    {
                        res.add(Arrays.asList(nums[i], nums[j], nums[l], nums[r]));
                        while (l < r && nums[l] == nums[l + 1]) l++;
                        while (l < r && nums[r] == nums[r - 1]) r--;
                        l++; r--;
                    } else if (sum > target)
                    {
                        r--;
                    }
                    else
                    {
                        l++;
                    }
                }
            }
        }
        return res;
    }
View Code

7 26 Remove Duplicates from Sorted Array  index = 1  i 和i -1 比

    public int removeDuplicates(int[] nums) {
        int index = 1;
        for (int i = 1; i < nums.length; i++)
        {
            if (nums[i] != nums[i - 1])
            {
                nums[index++] = nums[i];
            }
        }
        return index;
    }
View Code

8 27 Remove Element

    public int removeElement(int[] nums, int val) {
        int index = 0;
        for (int i = 0; i < nums.length; i++)
        {
            if (nums[i] != val)
            {
                nums[index++] = nums[i];
            }
        }
        return index;
    }
View Code

 4 月 5号

9 31 Next Permutation  》1    交换  sec反转

    public void nextPermutation(int[] nums) {
        if (nums == null || nums.length <= 1)
        {
            return;
        }
        int i = nums.length - 1;
        for (;i >= 1; i--)
        {
            if (nums[i] > nums[i - 1])
            {
                break;
            }
        }
        if (i != 0)
        {
            swap(i - 1, nums);
        }
        reverse(i, nums);
    }
    public void swap(int i, int[] nums)
    {
        for (int j = nums.length - 1; i < j; j--)
        {
            if (nums[j] > nums[i])
            {
                int temp = nums[i];
                nums[i] = nums[j];
                nums[j] = temp;
                break;
            }
        }
    }
    public void reverse(int index, int[] nums)
    {
        int l = index, r = nums.length - 1;
        while (l < r)
        {
            int temp = nums[l];
            nums[l] = nums[r];
            nums[r] = temp;
            l++;
            r--;
        }
    }
View Code

10. 33 Search in Rotated Array    二分  找有序 去一半   注意先比较r

    public int search(int[] A, int target) {
        int l = 0, r = A.length - 1;
        while (l <= r)
        {
            int m = l + (r - l) / 2;
            if (A[m] == target)
            {
                return m;
            }
            if (A[m] < A[r])
            {
                if (target > A[m] && target <= A[r])
                    l = m + 1;
                else
                    r = m - 1;
            }
            else
            {
                if (target >= A[l] && target < A[m])
                    r = m - 1;
                else
                    l = m + 1;
            }
        }
        return -1;
    }
View Code

11 34 Search for a range  两次二分查找  如果左  a[l]  < target

    public int[] searchRange(int[] nums, int target) {
        int[] res = {-1, -1};
        if (nums == null || nums.length == 0)
        {
            return res;
        }
        int l = 0, r = nums.length - 1;
        while (l <= r)
        {
            int m = (r - l) / 2 + l;
            if (nums[m] < target)
            {
                l = m + 1;
            }
            else
            {
                r = m - 1;
            }
        }
        int rl = 0;
        r = nums.length - 1;
        while (rl <= r)
        {
            int m = (r - rl) / 2 + rl;
            if (nums[m] <= target)
            {
                rl = m + 1;
            }
            else
            {
                r = m - 1;
            }
        }
        if (l <= r)
        {
            res[0] = l;
            res[1] = r;
        }
        return res;
    }
View Code

12 35  Search Insert Position   <=   l  比目标大 r 比,比目标小

    public int searchInsert(int[] nums, int target) {
        int l = 0, r = nums.length - 1;
        while (l <= r)
        {
            int m = (r - l) / 2 + l;
            if (nums[m] == target)
            {
                return m;
            } else if (nums[m] > target)
            {
                r = m - 1;
            }
            else
            {
                l = m + 1;
            }
        }
        return l;
    }
View Code

 4 月 6 号

13  39 Combination  Sum  递归,分三部分  可重复

    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        ArrayList<List<Integer>> res = new ArrayList<>();
        Arrays.sort(candidates);
        if (candidates == null || candidates.length == 0)
        {
            return res;
        }
        helper(candidates, target, 0, new ArrayList<Integer>(), res);
        return res;
    }
    public void helper(int[] candidates, int target, int index, ArrayList<Integer> item, ArrayList<List<Integer>> res)
    {
        if (target == 0)
        {
            res.add(new ArrayList(item));
            return;
        } 
        else if (target < 0)
        {
            return;
        }
        else
        {
            for (int i = index; i < candidates.length; i++)
            {
                item.add(candidates[i]);
                helper(candidates, target - candidates[i], i, item, res);
                item.remove(item.size() - 1);
            }
        }
    }
View Code

14 40 Combination Sum II  在上面基础上去重 ,i + 1

   public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        ArrayList<List<Integer>> res = new ArrayList<>();
        Arrays.sort(candidates);
        if (candidates == null || candidates.length == 0)
        {
            return res;
        }
        helper(candidates, target, 0, new ArrayList<Integer>(), res);
        return res;
    }
    public void helper(int[] candidates, int target, int index, ArrayList<Integer> item, ArrayList<List<Integer>> res)
    {
        if (target == 0)
        {
            res.add(new ArrayList(item));
            return;
        } 
        if (target < 0)
        {
            return;
        }
            for (int i = index; i < candidates.length; i++)
            {
                if (i > index && candidates[i] == candidates[i - 1]) continue;
                item.add(candidates[i]);
                helper(candidates, target - candidates[i], i + 1, item, res);
                item.remove(item.size() - 1);
            }
    }
View Code

15 216 Combination Sum III  1 到 9

    public List<List<Integer>> combinationSum3(int k, int n) {
         ArrayList<List<Integer>> res = new ArrayList<>();
        helper(n, 1, new ArrayList<Integer>(), res, k);
        return res;
    }
    public void helper(int target, int index, ArrayList<Integer> item, ArrayList<List<Integer>> res, int k)
    {
        if (target == 0 && item.size() == k)
        {
            res.add(new ArrayList(item));
            return;
        } 

            for (int i = index; i < 10; i++)
            {
                item.add(i);
                helper(target - i, i + 1, item, res, k);
                item.remove(item.size() - 1);
            }
    }
View Code

 16 78 Subsets    加入 递归 删除

    public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> res = new ArrayList<>();
        Arrays.sort(nums);
        helper(nums, new ArrayList<Integer>(), res, 0);
        return res;
    }
    public void helper(int[] nums, ArrayList<Integer> item, List<List<Integer>> res, int start)
    {
        res.add(new ArrayList<>(item));
        for (int i = start; i < nums.length; i++)
        {
            item.add(nums[i]);
            helper(nums, item, res, i + 1);
            item.remove(item.size() - 1);
        }
    }
View Code

 4 月 7 号

17 90 Subsets II  删除重复 

    public List<List<Integer>> subsetsWithDup(int[] nums) {
        List<List<Integer>> res = new ArrayList<>();
        Arrays.sort(nums);
        helper(nums, 0, new ArrayList<Integer>(), res);
        return res;
    }
    public void helper(int[] nums, int index, ArrayList<Integer> item, List<List<Integer>> res)
    {
        res.add(new ArrayList<>(item));
        for (int i = index; i < nums.length; i++)
        {
            if (i > index && nums[i] == nums[i - 1]) continue;
            item.add(nums[i]);
            helper(nums, i + 1, item, res);
            item.remove(item.size() - 1);
        }
    }
View Code

18 46 Permutations  排列组合  循环

public List<List<Integer>> permute(int[] nums) {
   List<List<Integer>> list = new ArrayList<>();
   // Arrays.sort(nums); // not necessary
   backtrack(list, new ArrayList<>(), nums);
   return list;
}

private void backtrack(List<List<Integer>> list, List<Integer> tempList, int [] nums){
   if(tempList.size() == nums.length){
      list.add(new ArrayList<>(tempList));
   } else{
      for(int i = 0; i < nums.length; i++){ 
         if(tempList.contains(nums[i])) continue; // element already exists, skip
         tempList.add(nums[i]);
         backtrack(list, tempList, nums);
         tempList.remove(tempList.size() - 1);
      }
   }
} 
View Code

19  47 Permutations II   删除重复

    public List<List<Integer>> permuteUnique(int[] nums) {
        List<List<Integer>> res = new ArrayList<>();
        Arrays.sort(nums);
        helper(nums, new ArrayList<Integer>(), new boolean[nums.length], res);
        return res;
    }
    public void helper(int[] nums, ArrayList<Integer> item, boolean[] used, List<List<Integer>> res)
    {
        if (item.size() == nums.length)
        {
            res.add(new ArrayList<Integer>(item));
            return;
        }
        for (int i = 0; i < nums.length; i++)
        {
            if (used[i] || i > 0 && nums[i] == nums[i - 1] && !used[i - 1]) continue;
            item.add(nums[i]);
            used[i] = true;
            helper(nums, item, used, res);
            used[i] = false;
            item.remove(item.size() - 1);
        }
    }
View Code

20  131 Palindrome Partitioning   检测 递归 重复

    public List<List<String>> partition(String s) {
        List<List<String>> res = new ArrayList<>();
        helper(s, 0,  new ArrayList<String>(), res);
        return res;
    }
    public void helper(String s, int start, ArrayList<String> item, List<List<String>> res)
    {
        if (start == s.length())
        {
            res.add(new ArrayList<String>(item));
            return;
        }
        for (int i = start; i < s.length(); i++)
        {
            if (isPalin(s, start, i))
            {
                item.add(s.substring(start, i + 1));
                helper(s, i + 1, item, res);
                item.remove(item.size() - 1);
            }
        }
    }
    public boolean isPalin(String s, int l, int r)
    {
        while (l < r)
        {
            if (s.charAt(l) != s.charAt(r))
            {
                return false;
            }
            l++; r--;
        }
        return true;
    }
View Code

 4 月 9 号 

21 41 First Missing Positive    找到数字的正确位置  a[i] - 1 = i   一定先存储a[a[i] - 1]  比如num == 5 ,把他放到num[4]位置上

    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])
            {
                int temp = nums[nums[i] - 1];
                nums[nums[i] - 1] = nums[i];
                nums[i] = temp;
            }
        }
        for (int i = 0; i < nums.length; i++)
        {
            if (nums[i] != i + 1)
            {
                return i + 1;
            }
        }
        return nums.length + 1;
    }
View Code

22  42 Trapping Rain Water  找两边最大值的最小,减去那边的值  找出每个的左右边界 

    public int trap(int[] height) {
        int l = 0, r = height.length - 1, count = 0;
        int maxL = 0, maxR = 0;
        while (l <= r)
        {
            maxL = maxL > height[l] ? maxL : height[l];
            maxR = maxR > height[r] ? maxR : height[r];
            if (maxL < maxR)
            {
                count += maxL - height[l];
                l++;
            }
            else
            {
                count += maxR - height[r];
                r--;
            }
        }
        return count;
    }
View Code

23 55 Jump Game  维护到第i步走到的最大距离

    public boolean canJump(int[] nums) {
        int reach = 0;
        for (int i = 0; i < nums.length && i <= reach; i++)
        {
            reach = Math.max(reach, nums[i] + i);
        }
        if (reach < nums.length - 1)
        {
            return false;
        }
        return true;
    }
View Code

24  45 Jump Game II  BFS   动态规划

    public int jump(int[] nums) {
        if (n < 2) return 0;
        int curMax = 0, nextMax = 0, leve = 0, i = 0;
        while (curMax - i + 1 > 0)
        {
            leve++;
            for (; i <= curMax; i++)
            {
                nextMax = Math.max(nextMax, i + nums[i]);
                if (naxtMax >= nums.length - 1) return true;
            }
            curMax = nextMax;
        }
        return 0;
    }
View Code
    public int jump(int[] nums) {
        if (nums == null || nums.length ==0) return 0;
        int curMax = 0, nextMax = 0, leve = 0;
        for (int i = 0; i <= nextMax && i < nums.length; i++)
        {
            if (i > curMax)
            {
                leve ++;
                curMax = nextMax;
            }
            nextMax = Math.max(nextMax, i + nums[i]);
        }
        if (nextMax < nums.length - 1)
        {
            return 0;
        }
        return leve;
    }
View Code

 4 月 10 号

25 48 Rotate Image  上下交换  \ 角线交换

    public void rotate(int[][] matrix) {
        int n = matrix.length;
        for (int i = 0; i < n / 2; i++)
        {
            for (int j = 0; j < n; j++)
            {
                int temp = matrix[i][j];
                matrix[i][j] = matrix[n - 1 - i][j];
                matrix[n - 1 - i][j] = temp;
            }
        }
        for (int i = 0; i < n; i++)
        {
            for (int j = i + 1; j < n; j++)
            {
                int temp = matrix[i][j];
                matrix[i][j] = matrix[j][i];
                matrix[j][i] = temp;
            }
        }
    }
View Code

26 53 Maximum Subarray  动态规划

    public int maxSubArray(int[] nums) {
        int n = nums.length;
        int[] dp = new int[n];
        dp[0] = nums[0];
        int max = dp[0];
        for (int i = 1; i < n; i++)
        {
            dp[i] = dp[i - 1] > 0 ? dp[i - 1] + nums[i] : nums[i];
            max = Math.max(max, dp[i]);
        }
        return max;
    }
View Code

 27 54 Spiral Matrix    四个变量 行列开尾

    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> res = new ArrayList<Integer>();
        if (matrix == null || matrix.length == 0)
        {
            return res;
        }
        int rowB = 0, rowE = matrix.length - 1;
        int colB = 0, colE = matrix[0].length - 1;
        while (rowB <= rowE && colB <= colE)
        {
            for (int j = colB; j <= colE; j++)
            {
                res.add(matrix[rowB][j]);
            }
            rowB++;
            for (int j = rowB; j <= rowE; j++)
            {
                res.add(matrix[j][colE]);
            }
            colE--;
            if (rowB <= rowE)
            {
                for (int j = colE; j >= colB; j--)
                {
                    res.add(matrix[rowE][j]);
                }
            }
            rowE--;
            if (colB <= colE)
            {
                for (int j = rowE; j >= rowB; j--)
                {
                    res.add(matrix[j][colB]);
                }
            }
            colB++;
        }
        return res;
    }
View Code

28 59 Spiral Matrix II

    public int[][] generateMatrix(int n) {
        int[][] res = new int[n][n];
        int rowB = 0, rowE = n - 1;
        int colB = 0, colE = n - 1, num = 1;
        while (rowB <= rowE && colB <= colE)
        {
            for (int i = colB; i <= colE; i++)
            {
                res[rowB][i] = num++;
            }
            rowB++;
            for (int i = rowB; i <= rowE; i++)
            {
                res[i][colE] = num++;
            }
            colE--;
            for (int i = colE; i >= colB; i--)
            {
                if (rowB <= rowE)
                {
                    res[rowE][i] = num++;
                }
            }
            rowE--;
            for (int i = rowE; i >= rowB; i--)
            {
                if (colB <= colE)
                {
                    res[i][colB] = num++;
                }
            }
            colB++;
        }
        return res;
    }
View Code

 4 月 11 号

29 56 Merge Intervals    排序开始  头尾   遍历

   public List<Interval> merge(List<Interval> intervals) {
        if (intervals.size() <= 1)
        {
            return intervals;
        }
        intervals.sort((i1,i2) -> Integer.compare(i1.start,i2.start));
        List<Interval> list = new ArrayList<Interval>();
        int start = intervals.get(0).start;
        int end = intervals.get(0).end;
        for (Interval interval : intervals)
        {
            if (interval.start <= end)
            {
                end = Math.max(end, interval.end);
            }
            else
            {
            list.add(new Interval(start, end));
            start = interval.start;
            end = interval.end;
            }
        }
        list.add(new Interval(start, end));
        return list;
    }
View Code

30  57 Insert Interval   找到插入位置   遍历  改变插入

    public List<Interval> insert(List<Interval> intervals, Interval in) {
        List<Interval> list = new ArrayList<>();
        for (Interval i : intervals)
        {
            if (in == null || i.end < in.start)
            {
                list.add(i);
            } else if (i.start > in.end)
            {
                list.add(in);
                list.add(i);
                in = null;
            }else
            {
                in.start = Math.min(i.start, in.start);
                in.end = Math.max(i.end, in.end);
            }
        }
        if (in != null)
        {
            list.add(in);
        }
        return list;
    }
View Code

31 62 Unique Paths  动态规划res[j] +=res[j-1]

    public int uniquePaths(int m, int n) {
        if (m <= 0 || n <= 0)
        {
            return 0;
        }
        int[] res = new int[n];
        res[0] = 1;
        for (int i = 0; i < m; i++)
        {
            for (int j = 1; j < n; j++)
            {
                res[j] += res[j - 1];
            }
        }
        return res[n - 1];
    }
View Code

32  Unique Paths II

    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int[] res = new int[obstacleGrid[0].length];
        res[0] = 1;
        for (int i = 0; i < obstacleGrid.length; i++)
        {
            for (int j = 0; j < obstacleGrid[0].length; j++)
            {
                if (obstacleGrid[i][j] == 1)
                {
                    res[j] = 0;
                }
                else
                {
                    if (j > 0)
                    {
                        res[j] += res[j - 1];
                    }
                }
            }
        }
        return res[obstacleGrid[0].length - 1];
    }
View Code

 4 月 12号

33 64 Minmum Path Sum  动态规划 ,比较左上 取小

    public int minPathSum(int[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        int[] res = new int[n];
        res[0] = grid[0][0];
        for (int i = 1; i < n; i++)
        {
            res[i] = res[i - 1] + grid[0][i];
        }
        for (int i = 1; i < m; i++)
        {
            for (int j = 0; j < n; j++)
            {
                if (j == 0)
                {
                    res[j] = res[j] + grid[i][j];
                }else
                {
                    res[j] = Math.min(res[j - 1], res[j]) + grid[i][j];
                }
            }
        }
        return res[n - 1];
    }
View Code

34 66 Plus One 从后往前遍历  比较9

        for (int i = digits.length - 1; i >= 0; i--)
        {
            if (digits[i] < 9)
            {
                digits[i]++;
                return digits;
            }
            digits[i] = 0;
        }
        int[] res = new int[digits.length + 1];
        res[0] = 1;
        return res;
    }
View Code

35  73  Set Matrix Zeroes    第一行第一列标记   从后向前  col0

   public void setZeroes(int[][] matrix) { 
    int col0 = 1, rows = matrix.length, cols = matrix[0].length;

    for (int i = 0; i < rows; i++) {
        if (matrix[i][0] == 0) col0 = 0;
        for (int j = 1; j < cols; j++)
            if (matrix[i][j] == 0)
                matrix[i][0] = matrix[0][j] = 0;
    }

    for (int i = rows - 1; i >= 0; i--) {
        for (int j = cols - 1; j >= 1; j--)
            if (matrix[i][0] == 0 || matrix[0][j] == 0)
                matrix[i][j] = 0;
        if (col0 == 0) matrix[i][0] = 0;
    }
    }
View Code

36 74 Search a 2D Matrix  二分查找  ,找对行和列

public boolean searchMatrix(int[][] matrix, int target) {
    
    int row_num = matrix.length;
    int col_num = matrix[0].length;
    
    int begin = 0, end = row_num * col_num - 1;
    
    while(begin <= end){
        int mid = (begin + end) / 2;
        int mid_value = matrix[mid/col_num][mid%col_num];
        
        if( mid_value == target){
            return true;
        
        }else if(mid_value < target){
            //Should move a bit further, otherwise dead loop.
            begin = mid+1;
        }else{
            end = mid-1;
        }
    }
    
    return false;
}
View Code

 4 月 13 号

37 75 Sort Colors  i3, i2, i1 先检测0

    public void sortColors(int[] nums) {
        int i0 = 0, i1 = 0, i2 = 0;
        for (int i = 0; i < nums.length; i++)
        {
            if (nums[i] == 0)
            {
                nums[i2++] = 2;
                nums[i1++] = 1;
                nums[i0++] = 0;
            } else if (nums[i] == 1)
            {
                nums[i2++] = 2;
                nums[i1++] = 1;
            }else
            {
                i2++;
            }
        }
    }
View Code

38 79 Word Search   深度优先搜索

    public boolean exist(char[][] board, String word) {
        for (int i = 0; i < board.length; i++)
        {
            for (int j = 0; j < board[0].length; j++)
            {
                if (help(board, i, j, word, 0))
                {
                    return true;
                }
            }
        }
        return false;
    }
    public boolean help(char[][] board, int i, int j, String word, int start)
    {
        if (start >= word.length()) return true;
        if (i < 0 || i >= board.length || j < 0 || j >= board[0].length) return false;
        if (board[i][j] == word.charAt(start++))
        {
            char c = board[i][j];
            board[i][j] = '#';
            boolean res =  help(board, i - 1, j, word, start) ||  help(board, i + 1, j, word, start) || 
             help(board, i, j - 1, word, start) ||  help(board, i, j + 1, word, start);
            board[i][j] = c;
            return res;
        }
        return false;
    }
View Code

39  80 Remvove Duplicates from Sorted Array II  遍历, 比较i个和i-2个

    public int removeDuplicates(int[] nums) {
        int i = 0;
        for (int n : nums)
        {
            if (i < 2 || n > nums[i - 2])
            {
                nums[i++] = n;
            }
        }
        return i;
    }
View Code

40  81 Search in Rotated Array  二分 比较左边

    public boolean search(int[] nums, int target) {
        int l = 0, r = nums.length - 1;
        while (l <= r)
        {
            int m = (r - l) / 2 + l;
            if (nums[m] == target) return true;
            if (nums[m] > nums[l])
            {
                if (nums[l] <= target && target < nums[m])
                {
                    r = m - 1;
                }else
                {
                    l = m + 1;
                }
            }else if (nums[m] < nums[l])
            {
                if (nums[m] < target && target <= nums[r])
                {
                    l = m + 1;
                }else
                {
                    r = m - 1;
                }
            }else
            {
                l++;
            }
        }
        return false;
    }
View Code

 4 月 14 号

41  84 Largest Rectangle in Histogram  维护栈  最后加0

    public int largestRectangleArea(int[] heights) {
        int len = heights.length;
        int max = 0;
        Stack<Integer> stack = new Stack<>();
        for (int i = 0; i <= len; i++)
        {
            int h = i == len ? 0: heights[i];
            if (stack.isEmpty() || h >= heights[stack.peek()])
            {
                stack.push(i);
            } else
            {
                int tp = stack.pop();
                max = Math.max(max, heights[tp] * (stack.isEmpty() ? i : i - 1 - stack.peek()));
                i--;
            }
        }
        return max;
    }
View Code

42 85 Maximal Rectangle  用上一个题的答案

    public int maximalRectangle(char[][] matrix) {
    if(matrix==null || matrix.length==0 || matrix[0].length==0)  
    {  
        return 0;  
    }  
    int maxArea = 0;  
    int[] height = new int[matrix[0].length];  
    for(int i=0;i<matrix.length;i++)  
    {  
        for(int j=0;j<matrix[0].length;j++)  
        {  
            height[j] = matrix[i][j]=='0'?0:height[j]+1;  
        }  
        maxArea = Math.max(large(height),maxArea);  
    }  
    return maxArea; 
    }
    public int large(int[] heights) {
        int len = heights.length;
        int max = 0;
        Stack<Integer> stack = new Stack<>();
        for (int i = 0; i <= len; i++)
        {
            int h = i == len ? 0: heights[i];
            if (stack.isEmpty() || h >= heights[stack.peek()])
            {
                stack.push(i);
            } else
            {
                int tp = stack.pop();
                max = Math.max(max, heights[tp] * (stack.isEmpty() ? i : i - 1 - stack.peek()));
                i--;
            }
        }
        return max;
    }
View Code

43 88 Merge Sorted Array 三个标志  》0

    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int i = m - 1, j = n - 1, k = m + n - 1;
        while (i >= 0 && j >= 0) nums1[k--] = (nums1[i] > nums2[j]) ? nums1[i--] : nums2[j--];
        while (j >= 0) nums1[k--] = nums2[j--];
    }
View Code

44  105 Construct Binary Tree from Preorder Inorder Traverals

    public TreeNode buildTree(int[] preorder, int[] inorder) {
        return helper(0, 0, inorder.length - 1, preorder, inorder);
    }
    public TreeNode helper(int pres, int ins, int ine, int[] pre, int[] in)
    {
        if (pres > pre.length - 1 || ins > ine) return null;
        TreeNode root = new TreeNode(pre[pres]);
        int index = ins;
        for (int i = ins; i <= ine; i++)
        {
            if (in[i] == root.val)
            {
                index = i;
            }
        }
        root.left = helper(pres + 1, ins, index - 1, pre, in);
        root.right = helper(pres + index - ins + 1, index + 1, ine, pre, in);
        return root;
    }
View Code

 4 月 15 日

45  106 Construct Binary Tree from Inorder Postorder Traverals\

    public TreeNode buildTree(int[] inorder, int[] postorder) {
        if(inorder==null || postorder==null || inorder.length==0 || postorder.length==0)  
        {  
            return null;  
        }  
        HashMap<Integer,Integer> map = new HashMap<>();
        for (int i = 0; i < inorder.length; i++)
        {
            map.put(inorder[i],i);
        }
        return help(inorder, 0, inorder.length - 1, postorder, 0, postorder.length - 1, map);
    }
    public TreeNode help(int[] in, int ins, int ine, int[] po, int ps, int pe, HashMap<Integer,Integer> map)
    {
        if (ins > ine || ps > pe)
        {
            return null;
        }
        TreeNode root = new TreeNode(po[pe]);
        int index = map.get(root.val);
        root.left = help(in, ins, index - 1, po, ps, pe - (ine - index) - 1, map);
        root.right = help(in, index + 1, ine, po, pe - (ine - index), pe - 1, map);
        return root;
    }
View Code

46 118  pascal's Triangle   j = 1; j = j+1

    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> list = new ArrayList<>();
        List<Integer> row = new ArrayList<>();
        for (int i = 0; i < numRows; i++)
        {
            row.add(0, 1);
            for (int j = 1; j < row.size() - 1; j++)
            {
                row.set(j, row.get(j) + row.get(j + 1));
            }
            list.add(new ArrayList<Integer>(row));
        }
        return list;
    }
View Code

47 119  Pascal's Triangle II

    public List<Integer> getRow(int n) {
        if (n < 0) return null;
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < n+1; i++)
        {
            list.add(0,1);
            for (int j = 1; j < list.size() - 1; j++)
            {
                list.set(j, list.get(j) + list.get(j + 1));
            }
        }
        return list;
    }
View Code

48  120  Triangle  找小从下往上加

    public int minimumTotal(List<List<Integer>> triangle) {
        for (int i = triangle.size() - 2; i >= 0; i--)
            for (int j = 0; j <= i; j++)
                 triangle.get(i).set(j, triangle.get(i).get(j) + Math.min(triangle.get(i + 1).get(j), triangle.get(i + 1).get(j + 1)));
        return triangle.get(0).get(0);
    }
View Code

 4 月 16 号

49  121 BestTime to Buy and Sell Stock   如果正就加

    public int maxProfit(int[] prices) {
        int maxc = 0, maxso = 0;
        for (int i = 1; i < prices.length; i++)
        {
            maxc = Math.max(0, maxc+=prices[i] - prices[i-1]);
            maxso = Math.max(maxso, maxc);
        }
        return maxso;
    }
View Code

 50  122 Best Time to Buy and Sell Stock  II

    public int maxProfit(int[] prices) {
        int total = 0;
        for (int i = 1; i < prices.length; i++)
        {
            if (prices[i] > prices[i - 1])
            {
                total += prices[i] - prices[i - 1];
            }
        }
        return total;
    }
View Code

51  123 Best  time to buy and sell stock  III 4个变量   两买 两买 最大

    public int maxProfit(int[] prices) {
        int sell1 = 0, sell2 = 0, buy1 = Integer.MIN_VALUE, buy2 = Integer.MIN_VALUE;
        for (int i = 0; i < prices.length; i++)
        {
            buy1 = Math.max(buy1, -prices[i]);
            sell1 = Math.max(sell1, buy1 + prices[i]);
             buy2 = Math.max(buy2, sell1-prices[i]);
            sell2 = Math.max(sell2, buy2 + prices[i]);       
        }
        return sell2;
    }
View Code
    public int maxProfit(int[] prices) {  
        if(prices==null || prices.length==0)  
            return 0;  
        int[] local = new int[3];  
        int[] global = new int[3];  
        for(int i=0;i<prices.length-1;i++)  
        {  
            int diff = prices[i+1]-prices[i];  
            for(int j=2;j>=1;j--)  
            {  
                local[j] = Math.max(global[j-1]+(diff>0?diff:0), local[j]+diff);  
                global[j] = Math.max(local[j],global[j]);  
            }  
        }  
        return global[2];  
    }  
View Code

52 128 Longest Consecutive Sequence  维护最大序列长度

    public int longestConsecutive(int[] nums) {
        HashMap<Integer, Integer> map = new HashMap<>();
        int res = 0;
        for (int n : nums)
        {
            if (!map.containsKey(n))
            {
                int left = map.containsKey(n - 1) ? map.get(n - 1):0;
                int right = map.containsKey(n + 1) ? map.get(n + 1):0;
                int sum = right + left + 1;
                res = res > sum ? res:sum;
                map.put(n, sum);
                map.put(n - left, sum);
                map.put(n + right, sum);
            }
        }
        return res;
    }
View Code

 4 月 17 号

53 152 Maximum Product Subarray  保存到现在最大,最小 ,全局最大 动态规划

    public int maxProduct(int[] nums) {
        if (nums == null || nums.length == 0) return 0;
        if (nums.length < 2) return nums[0];
        int max = nums[0], min = nums[0], global = nums[0];
        for (int i = 1; i < nums.length; i++)
        {
            int a = max * nums[i];
            int b = min * nums[i];
            max = Math.max(nums[i], Math.max(a,b));
            min = Math.min(nums[i], Math.min(a, b));
            global = Math.max(max, global);
        }
        return global;
    }
View Codea

54 153 Find Minimum in Rotated Array  二分查找 如果左边小,就是左边

    public int findMin(int[] nums) {
        int l = 0, r = nums.length - 1;
        while (l < r)
        {
            if (nums[l] < nums[r]) return nums[l];
            int m = l + (r - l) / 2;
            if (nums[m] >= nums[l]) l = m + 1;
            else r = m;
        }
        return nums[l];
    }
View Code

55 154 Find Minmum in Rotated Sorted Array II

    public int findMin(int[] nums) {
        int l = 0, r = nums.length - 1;
        while (l < r)
        {
            if (nums[l] < nums[r]) return nums[l];
            int m = l + (r - l) / 2;
            if (nums[m] > nums[l]) l = m + 1;
            else if (nums[m] < nums[l]) r = m;
            else l++;
        }
        return nums[l];
    }
View Code

56 162  Find peak Element  根据条件二分查找

    public int findPeakElement(int[] num) {
    if (num.length <= 1) return 0;
    int mid = 0, l = 0, h = num.length - 1;
    
    while (l < h) {
        mid = (l + h) / 2;
        if (num[mid] > num[mid + 1])
            h = mid;
        else if (num[mid] < num[mid + 1])
            l = mid + 1;
    }
    
    return l;
    }
View Code

4 月 18 号 

57  163 Missing  Range l  r 找范围

    public List<String> findMissingRanges(int[] nums, int lower, int upper) {
        List<String> res = new ArrayList<>();
        int l = lower;
        for (int i = 0; i <= nums.length; i++)
        {
            int r = (i < nums.length && nums[i] <= upper) ? nums[i]:upper + 1;
            if (l == r) l = r + 1;
            else if (r > l)
            {
                res.add(r - l == 1 ? String.valueOf(l):from + "->" + (to - 1);
                l = r +  1;
            }
        }
        return res;
    }
View Code

58 167 Two sum ii 已排序 首位指针  加逼

    public int[] twoSum(int[] numbers, int target) {
        int[] res = new int[2];
        if (numbers == null || numbers.length < 2) return  res;
        int l = 0, r = numbers.length - 1;
        while (l < r)
        {
            int v = numbers[l] + numbers[r];
            if (v == target)
            {
                res[0] = l + 1;
                res[1] = r + 1;
                break;
            } else if (v > target) r--;
            else l++;
        }
        return res;
    }
View Code

59 169 Majority Element   两个变量 ,值和数 从第一个开始

    public int majorityElement(int[] nums) {
        int major = nums[0], count = 1;
        for (int i = 1; i < nums.length; i++)
        {
            if (count == 0)
            {
                major = nums[i];
                count++;
            } else if (major == nums[i]) 
            {
                count ++;
            }else
            {
                count --;
            }
        }
        return major;
    }
View Code

60 189 Rotate Array  三部移动

    public void rotate(int[] nums, int k) {
        k %= nums.length;
        reverse(nums, 0, nums.length - 1);
        reverse(nums,  0, k - 1);
        reverse(nums, k, nums.length - 1);
        
    }
    public void reverse(int[] nums, int l, int r)
    {
        while (l < r)
        {
            int temp = nums[l];
            nums[l] = nums[r];
            nums[r] = temp;
            l++;r--;
        }
    }
View Code

 4月19 号

61 209 Minimum Size Subarry Sum 维护四个变量左右边界,总 小

    public int minSubArrayLen(int s, int[] nums) {
        if (nums == null || nums.length == 0) return 0;
        int i = 0, j = 0, sum = 0, min = Integer.MAX_VALUE;
        while (j < nums.length)
        {
            sum += nums[j++];
            while (sum >= s)
            {
                min = Math.min(min, j - i);
                sum -= nums[i++];
            }
        }
        return min == Integer.MAX_VALUE? 0 : min;
    }
View Code

62 217 Contains Duplicate   hashMap   遍历

    public boolean containsDuplicate(int[] nums) {
        HashSet<Integer> res = new HashSet<Integer>();
        for (int n: nums)
        {
            if (res.contains(n)) return true;
            res.add(n);
        }
        return false;
    }
View Code

63 219 Contains Duplicate  II hashset  i >k  删i-k-1 插入 检测

    public boolean containsNearbyDuplicate(int[] nums, int k) {
        HashSet<Integer> set = new HashSet<Integer>();
        for (int i = 0; i < nums.length; i++)
        {
            if (i > k) set.remove(nums[i - k - 1]);
            if (!set.add(nums[i])) return true;
        }
        return false;
    }
View Code

64  228 Summary Ranges  检测左右边界

    public List<String> summaryRanges(int[] nums) {
        int len = nums.length;
        List<String> res = new ArrayList<>(len);
        for (int i = 0; i < len; i++)
        {
            int num = nums[i];
            while (i < len - 1 && nums[i] + 1 == nums[i + 1]) i++;
            if (num == nums[i]) res.add(num+"");
            else res.add(num + "->" + nums[i]);
        }
        return res;
    }
View Code

 4 月 20 号

65  229 Majority Element II 把检测是否相同放前面

    public List<Integer> majorityElement(int[] nums) {
        List<Integer> res = new ArrayList<Integer>();
        if (nums == null || nums.length == 0) return res;
        int num1 = 0, num2 = 0, c1 = 0, c2 = 0;
        for (int i = 0; i < nums.length; i++)
        {
            if (num2 == nums[i]) 
            {
                c2++;
            }
            else if(num1 == nums[i])
            {
                c1++;
            }
            else if (c1 == 0) 
            {
                num1 = nums[i];
                c1 = 1;
            }
            else if(c2 == 0)
            {
                num2 = nums[i];
                c2 = 1;
            }
            else
            {
                c1--; c2--;
            }
        }
        c1 = 0; c2 = 0;
        for (int i = 0; i < nums.length; i++)
        {
            if (num1 == nums[i]) c1++;
            else if (num2 == nums[i]) c2++;
        }
        if (c1 > nums.length / 3) res.add(num1);
        if (c2 > nums.length / 3) res.add(num2);
        return res;
    }
View Code

66 238 Product of Array Except Self  先从左扫描,在从右扫描

    public int[] productExceptSelf(int[] nums) {
        int len = nums.length;
        int[] res = new int[len];
        res[0] = 1;
        for (int i = 1; i < len; i++)
        {
            res[i] = res[i -1] * nums[i - 1];
        }
        int  right = 1;
        for (int i = len - 1; i >= 0; i--)
        {
            res[i] *= right;
            right *= nums[i];
        }
        return res;
    }
View Code

67 243 Short Words Distance  遍历数组,当遍历到单词时记录位置

    public int shortestDistance(String[] words, String word1, String word2) {  
        if (words == null) return -1;  
        int idx1 = -1, idx2 = -1;  
        int diff = words.length;  
        for (int i = 0; i < words.length; i++) {  
            if (words[i].equals(word1)) {  
                idx1 = i;                  
            } else if (words[i].equals(word2)) {  
                idx2 = i;                  
            }  
            if(idx1!=-1&&idx2!=-1){  
                diff = Math.min(diff,Math.abs(idx1-idx2));  
            }  
        }  
        return diff;  
    }  
View Code

68  Short Words Distance  II  hashmap 表,先找到单词下标表  在找两个小的比较,每次跳过较小的

public class WordDistance {
    
    HashMap<String, List<Integer>> map = new HashMap<String, List<Integer>>();
    
    public WordDistance(String[] words) {
        // 统计每个单词出现的下标存入哈希表中
        for(int i = 0; i < words.length; i++){
            List<Integer> cnt = map.get(words[i]);
            if(cnt == null){
                cnt = new ArrayList<Integer>();
            }
            cnt.add(i);
            map.put(words[i], cnt);
        }
    }

    public int shortest(String word1, String word2) {
        List<Integer> idx1 = map.get(word1);
        List<Integer> idx2 = map.get(word2);
        int distance = Integer.MAX_VALUE;
        int i = 0, j = 0;
        // 每次比较两个下标列表最小的下标,然后把跳过较小的那个
        while(i < idx1.size() && j < idx2.size()){
            distance = Math.min(Math.abs(idx1.get(i) - idx2.get(j)), distance);
            if(idx1.get(i) < idx2.get(j)){
                i++;
            } else {
                j++;
            }
        }
        return distance;
    }
View Codece

69 245 Short words Distance II  用一个标志是否是一样的

    public int shortestWordDistance(String[] words, String word1, String word2) {
        int idx1 = -1, idx2 = -1, distance = Integer.MAX_VALUE, turn = 0, inc = (word1.equals(word2) ? 1 : 0);
        for(int i = 0; i < words.length; i++){
            if(words[i].equals(word1) && turn % 2 == 0){
                idx1 = i;
                if(idx2 != -1) distance = Math.min(distance, idx1 - idx2);
                turn += inc;
            } else if(words[i].equals(word2)){
                idx2 = i;
                if(idx1 != -1) distance = Math.min(distance, idx2 - idx1);
                turn += inc;
            }
        }
        return distance;
    }
View Code

 

posted on 2017-04-03 11:23  wheleetcode  阅读(170)  评论(0编辑  收藏  举报