• 【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-面试题

  • 相关阅读:
    条件运算符 (?:)
    SVN地址修改
    dev -gridview隐藏子表标题
    继承与 Data Member(3)
    继承与 Data Member(2)
    继承与 Data Member(1)
    Data Member 的存取
    Data Member 的布局
    Data Member 的绑定
    对于 sizeof(class_name) 值的讨论(2)
  • 原文地址:https://www.cnblogs.com/liuawen/p/12854025.html
Copyright © 2020-2023  润新知