【LeetCode】数组排序题 Array_Sorts

数组排序 Array_Sorts

LeetCode 数组排序题

88. 合并两个有序数组

合并两个有序数组

难度简单

给你两个有序整数数组 nums1nums2,请你将 nums2 合并到 nums1 中*,*使 nums1 成为一个有序数组。

说明:

  • 初始化 nums1nums2 的元素数量分别为 mn
  • 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。

示例:

输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6],       n = 3

输出: [1,2,2,3,5,6]

通过次数141,733 提交次数298,842

_0088_合并两个有序数组.java



/**
 * https://leetcode-cn.com/problems/merge-sorted-array/
 * 合并两个有序数组 
 */
public class _0088_合并两个有序数组 {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        // nums1 = [1,3,5,0,0,0], m = 3
        // nums2 = [2,4,6],       n = 3
        int i1 = m - 1;
        int i2 = n - 1;
        int cur = nums1.length - 1;

        while (i2 >= 0) {
            if (i1 >= 0 && nums2[i2] < nums1[i1]) {
                nums1[cur--] = nums1[i1--];
            } else { // i1 < 0 || nums2[i2] >= nums1[i1]
                nums1[cur--] = nums2[i2--];
            }
        }
    }

}

75. 颜色分类

颜色分类

难度中等

给定一个包含红色、白色和蓝色,一共 n 个元素的数组,**原地**对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

注意:
不能使用代码库中的排序函数来解决这道题。

示例:

输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]

进阶:

  • 一个直观的解决方案是使用计数排序的两趟扫描算法。
    首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。
  • 你能想出一个仅使用常数空间的一趟扫描算法吗?

通过次数77,390 提交次数141,177

_0075_颜色分类.java

/**
 * https://leetcode-cn.com/problems/sort-colors/
 * 颜色分类
 */
public class _0075_颜色分类 {
    /*
     * 一个只包含0、1、2的整型数组,要求对它进行【原地】排序
     * 你能想出一个仅使用常数空间的一趟扫描算法吗?
     * 0、1、2整型数组 原地排序  常数空间 一趟扫描算法
     * 10大排序算法 借鉴下
     * 空间复杂度O(1),时间复杂度O(n)
     */
    public void sortColors(int[] nums) {
        //0、1、2   左右
        int i = 0;
        int l = 0;
        int r = nums.length - 1;
        while (i <= r) {
            if (nums[i] == 0) {
                swap(nums, i++, l++);
            } else if (nums[i] == 1) {
                i++;
            } else {
                swap(nums, i, r--);
            }
        }
    }

    private void swap(int[] nums, int i, int j) {
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j] = tmp;
    }

}

面试题 16.16. 部分排序

部分排序

难度中等

给定一个整数数组,编写一个函数,找出索引mn,只要将索引区间[m,n]的元素排好序,整个数组就是有序的。注意:n-m尽量最小,也就是说,找出符合条件的最短序列。函数返回值为[m,n],若不存在这样的mn(例如整个数组是有序的),请返回[-1,-1]

示例:

输入: [1,2,4,7,10,11,7,12,6,7,16,18,19]
输出: [3,9]

提示:

  • 0 <= len(array) <= 1000000

通过次数1,803

提交次数4,084

面试题_16_16_部分排序.java

/**
 * https://leetcode-cn.com/problems/sub-sort-lcci/
 */
public class 面试题_16_16_部分排序 {
    /*
     * { 1, 5, 4, 3, 2, 6, 7 }
     */

    public int[] subSort(int[] nums) {
        if (nums.length == 0) return new int[] { -1, -1 };

        // 从左扫描到右寻找逆序对(正序:逐渐变大)
        int max = nums[0];
        // 用来记录最右的那个逆序对位置
        int r = -1;
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] >= max) {
                max = nums[i];
            } else {
                r = i;
            }
        }

        // 提前结束
        if (r == -1) return new int[] { -1, -1 };

        // 从右扫描到左寻找逆序对(正序:逐渐变小)
        int min = nums[nums.length - 1];
        // 用来记录最左的那个逆序对位置
        int l = -1;
        for (int i = nums.length - 2; i >= 0; i--) {
            if (nums[i] <= min) {
                min = nums[i];
            } else {
                l = i;
            }
        }

        return new int[] { l, r };
    }

}

参考资料

1、力扣LeetCode

2、恋上数据结构与算法3-面试题

posted @ 2020-05-02 01:15  渐若窥宏大  阅读(254)  评论(0编辑  收藏  举报