zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    centos 7 配置ip
    Linux下安装jmeter
    eclipse 高效快捷键大全
    eclipse中不能找到dubbo.xsd报错”cvc-complex-type.2.4.c“的 两种解决方法
    大型网站系统架构演化之路(转)
    程序员技术练级攻略
    JSP和servlet之间的传值(总结的很全面)
    正则表达式笔记
    cenos 安装nginx并添加到service
    mac os重装php
  • 原文地址:https://www.cnblogs.com/whesuanfa/p/6661530.html
Copyright © 2011-2022 走看看