LeetCode-75. 颜色分类-Java-medium

题目链接

法一(三指针)
    /**
     * 交换数组中两个元素的位置
     *
     * @param nums
     * @param i
     * @param j
     */
    private void swap(int[] nums, int i, int j) {
        if (i != j) { // 两个相同的数^结果为0,开头加一个判断可以避免这种情况
            nums[i] ^= nums[j];
            nums[j] ^= nums[i];
            nums[i] ^= nums[j];
        }
    }

    /**
     * 三指针,借鉴快排思想,一趟扫描
     * 时间复杂度 O(n)
     * 空间复杂度 O(1)
     * 设置三指针left、right、cursor,left左边一定是0,right右边一定是2,cursor指向当前处理要的元素
     * cursor遇到0与left交换,遇到2与right交换,遇到1不交换,cursor单独前进
     *
     * @param nums
     */
    public void sortColors(int[] nums) {
        int left = 0, right = nums.length - 1, cursor = 0;
        while (cursor <= right) {
            if (nums[cursor] == 0) {
                swap(nums, cursor++, left++);
            } else if (nums[cursor] == 2) { // cursor不能前进,因为不知道从right交换过来的是什么数字
                swap(nums, cursor, right--);
            } else {
                cursor++;
            }
        }
    }
本地测试
        /**
         * 75. 颜色分类
         */
        lay.showTitle(75);
        Solution75 sol75 = new Solution75();
        int[] nums75 = new int[]{2};
        System.out.println(Arrays.toString(nums75));
        sol75.sortColors(nums75);
        System.out.println(Arrays.toString(nums75));

你可能感兴趣的:(#,双指针,java,leetcode,算法)