zoukankan      html  css  js  c++  java
  • 3 Two Pointers Algorithm

    143. Sort Colors II (quick sort 变种)

    https://www.lintcode.com/problem/sort-colors-ii/description?_from=ladder&&fromId=1

    public class Solution {
        /**
         * @param colors: A list of integer
         * @param k: An integer
         * @return: nothing
         */
        public void sortColors2(int[] colors, int k) {
            // write your code here
            quickSort(colors, 0, colors.length - 1, 1, k);
        }
        
        public void quickSort(int[] colors, int left, int right, int colorFrom, int colorTo) {
            if(left >= right) {
                return;
            }
            if(colorFrom >= colorTo) {
                return;
            }
            int l = left, r = right;
            int mid = colorFrom + (colorTo - colorFrom) / 2;
            while(l <= r) {
                while(l <= r && colors[l] <= mid) {
                    l++;
                }
                while(l <= r && colors[r] > mid) {
                    r--;
                }
                if(l <= r) {
                    int temp = colors[l];
                    colors[l] = colors[r];
                    colors[r] = temp;
                    l++;
                    r--;
                }
            }
            quickSort(colors, left, r, colorFrom, mid);
            quickSort(colors, l, right, mid + 1, colorTo);
        }
    }

    57. 3Sum

    https://www.lintcode.com/problem/3sum/description?_from=ladder&&fromId=1

    public class Solution {
        /**
         * @param numbers: Give an array numbers of n integer
         * @return: Find all unique triplets in the array which gives the sum of zero.
         */
        public List<List<Integer>> threeSum(int[] numbers) {
            // write your code here
            List<List<Integer>> result = new LinkedList<>();
            if(numbers == null || numbers.length < 3) return result;
            Arrays.sort(numbers);
            int len = numbers.length - 1;
            int i = 0;
            while(i <= len - 2) {
                while(i >= 1 && i < len && numbers[i] == numbers[i - 1]) {
                    i++;
                } 
                int sum = 0 - numbers[i];
                int left = i + 1;
                int right = len;
                while(left + 1 <= right) {
                    if(numbers[left] + numbers[right] == sum) {
                        result.add(Arrays.asList(numbers[i], numbers[left], numbers[right]));
                        left++;
                        right--;
                        while(left + 1 <= right && numbers[left] == numbers[left - 1]) {
                            left++;
                        }
                        while(left + 1 <= right && numbers[right] == numbers[right + 1]) {
                            right--;
                        }
                    } else if(numbers[left] + numbers[right] > sum) {
                        right--;
                    } else {
                        left++;
                    }
                }
                i++;
            }
            return result;
        }
    }

    31. Partition Array (quick sort)

    https://www.lintcode.com/problem/partition-array/description?_from=ladder&&fromId=1

    public class Solution {
        /**
         * @param nums: The integer array you should partition
         * @param k: An integer
         * @return: The index after partition
         */
        public int partitionArray(int[] nums, int k) {
            // write your code here
            if(nums == null || nums.length == 0) return 0;
            int left = 0, right = nums.length - 1;
            while(left <= right) {
                while(left <= right && nums[left] < k) {
                    left++;
                }
                while(left <= right && nums[right] >= k) {
                    right--;
                }
                if(left <= right) {
                    int temp = nums[left];
                    nums[left] = nums[right];
                    nums[right] = temp;
                    left++;
                    right--;
                }
            }
            return left;
        }
    }
  • 相关阅读:
    CF1051F The Shortest Statement 题解
    CF819B Mister B and PR Shifts 题解
    HDU3686 Traffic Real Time Query System 题解
    HDU 5969 最大的位或 题解
    P3295 萌萌哒 题解
    BZOJ1854 连续攻击游戏 题解
    使用Python编写的对拍程序
    CF796C Bank Hacking 题解
    BZOJ2200 道路与航线 题解
    USACO07NOV Cow Relays G 题解
  • 原文地址:https://www.cnblogs.com/jenna/p/10777579.html
Copyright © 2011-2022 走看看