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;
        }
    }
  • 相关阅读:
    08 正则表达式
    07 函数&对象
    06 Math&Date&Json
    05 数组&字符串
    04 循环控制
    03 流程控制
    02 数据类型&运算符
    大道至简
    Avg_row_length是怎么计算的?
    理解innodb buffer pool
  • 原文地址:https://www.cnblogs.com/jenna/p/10777579.html
Copyright © 2011-2022 走看看