首页 > 其他分享 >sortedArrDistanceLessK() 已知一个几乎有序的数组。几乎有序是指,如果把数组排好顺序的话,每个元素移动的距离一定不超过k,并且k相对于数组长度来说是比较小的。 请选择一个合适的排

sortedArrDistanceLessK() 已知一个几乎有序的数组。几乎有序是指,如果把数组排好顺序的话,每个元素移动的距离一定不超过k,并且k相对于数组长度来说是比较小的。 请选择一个合适的排

时间:2022-12-31 14:33:57浏览次数:70  
标签:index sortedArrDistanceLessK 数组 int PriorityQueue 有序 排序

package class06;

import java.util.Arrays;
import java.util.PriorityQueue;

/**
 * sortedArrDistanceLessK()
 * 已知一个几乎有序的数组。几乎有序是指,如果把数组排好顺序的话,每个元素移动的距离一定不超过k,并且k相对于数组长度来说是比较小的。
 * 请选择一个合适的排序策略,对这个数组进行排序。
 */
public class Code04_SortArrDistanceLessK {
    public static void sortedArrDistanceLessK(int[] arr, int k) {
//        arr = new int[]{2, 1, 8, 4, 9, 3, 5};
        if (k == 0) {
            return;
        }
        PriorityQueue<Integer> heap = new PriorityQueue<>();
        int index = 0;
        for (; index <= Math.min(arr.length - 1, k - 1); index++) {//=号不能少,如果不写=号,会导致排序错误。
            heap.add(arr[index]);
        }
        int i = 0;
        for (; index < arr.length; i++, index++) {
            heap.add(arr[index]);
            arr[i] = heap.poll();
        }
        while (!heap.isEmpty()) {
            arr[i++] = heap.poll();
        }
    }

    public static void sortedArrDistanceLessK111(int[] arr, int k) {
        if (k == 0) {
            return;
        }
        // 默认小根堆
        PriorityQueue<Integer> heap = new PriorityQueue<>();
        int index = 0;
        // 0...K-1
        for (; index <= Math.min(arr.length - 1, k - 1); index++) {
            heap.add(arr[index]);
        }
        int i = 0;
        for (; index < arr.length; i++, index++) {
            heap.add(arr[index]);
            arr[i] = heap.poll();
        }
        while (!heap.isEmpty()) {
            arr[i++] = heap.poll();
        }
    }

    public static int[] randomArrayNoMoveMoreK(int maxSize, int maxValue, int K) {
        int[] arr = new int[(int) (Math.random() * (maxSize + 1))];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int) (Math.random() * maxValue);
        }
        Arrays.sort(arr);
        boolean[] isSwapped = new boolean[arr.length];
        for (int i = 0; i < arr.length; i++) {
//            int j = (int) (Math.random() * (Math.min(arr.length - 1, K - 1)));
            int j = Math.min(i + (int) (Math.random() * (K + 1)), arr.length - 1);
            if (!isSwapped[i] && !isSwapped[j]) {
                isSwapped[i] = true;
                isSwapped[j] = true;
                swap(arr, i, j);
            }
        }
        return arr;
    }

    public static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    public static int[] copyArray(int[] arr) {
        if (arr == null) {
            return null;
        }
        int[] res = new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            res[i] = arr[i];
        }
        return res;
    }

    // for test
    public static boolean isEqual(int[] arr1, int[] arr2) {
        if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)) {
            return false;
        }
        if (arr1 == null && arr2 == null) {
            return true;
        }
        if (arr1.length != arr2.length) {
            return false;
        }
        for (int i = 0; i < arr1.length; i++) {
            if (arr1[i] != arr2[i]) {
                return false;
            }
        }
        return true;
    }

    // for test
    public static void printArray(int[] arr) {
        if (arr == null) {
            return;
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        int maxSize = 100;
        int maxValue = 100;
        int testTimes = 100000;
        System.out.println("test start!");
        for (int i = 0; i < testTimes; i++) {
            int k = (int) (Math.random() * maxSize) + 1;
            //int k = 3;
            int[] arr0 = randomArrayNoMoveMoreK(maxSize, maxValue, k);
            int[] arr1 = copyArray(arr0);
            int[] arr2 = copyArray(arr0);
            sortedArrDistanceLessK(arr1, k);
            Arrays.sort(arr2);
            if (!isEqual(arr1, arr2)) {
                System.out.println("oops!");
                System.out.println("k = " + k);
                System.out.println("arr0 = " + Arrays.toString(arr0));
                System.out.println("arr1 = " + Arrays.toString(arr1));
                System.out.println("arr2 = " + Arrays.toString(arr2));
                break;
            }
        }
        System.out.println("test end!");
    }

}

 

标签:index,sortedArrDistanceLessK,数组,int,PriorityQueue,有序,排序
From: https://www.cnblogs.com/TheFloorIsNotTooHot/p/17016622.html

相关文章

  • 【数组】LeetCode 27. 移除元素
    题目链接27.移除元素思路先设定变量idx,指向待插入位置。idx初始值为0。然后从题目的「要求/保留逻辑」出发,来决定当遍历到任意元素x时,应该做何种决策:如果当前元素......
  • vue中具有响应的数组
    1.在vue中可以改变原数组的方法只有7个数组的方法是响应式的,其他都不是响应式的pushpopunshiftshiftsortreversesplice2.如果直接通过索引号修改数组成员,界面是......
  • C# 随机分组 | 集合分组 | 集合(列表、数组)分成几组
    直接上代码:///<summary>///随机分组///</summary>///<paramname="list">列表集合</param>///<paramname="GroupCount">组数</param>///<returns></returns>......
  • 排序
    快速排序平均时间复杂度O(nlogn),最坏时间复杂度O(n^2),时间开销与待排数组初始状态有关,当待排数组有序时,效率最低。空间复杂度最坏O(n),最好O(logn)intpartition(inta......
  • 有序数组的平方&长度最小的子数组&螺旋矩阵Ⅱ
    一、有序数组的平方977.有序数组的平方leetcode链接1.方法概述双"指针"解法:因为数组本来是有序的,平方后可能出现的两端大数值大的情况。所以从数组两端开始遍历,谁大就......
  • BM5 合并k个已排序的链表
    题目描述合并k个升序的链表并将结果作为一个升序的链表返回其头节点。思路分析之前已经完成了两条有序链表的排序,那么对于任意条有序链表的合并我们都可以借助之前的......
  • 【归并排序】【链表】LeetCode 148. 排序链表
    题目链接148.排序链表思想分割cut环节:找到当前链表中点,并从中点将链表断开(以便在下次递归cut时,链表片段拥有正确边界)我们使用fast,slow快慢双指针法,奇数个......
  • 树状数组
     lowbit函数inlineintlowbit(intx){returnx&(-x);} 单点修改voidupdate(intres,intplus){ for(inti=res;i<=n;i+=lowbit(i)) c[i]+=pl......
  • 刷刷刷Day2| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II
    977.有序数组的平方LeetCode题目要求给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。示例1:输入:nums=[-4,-......
  • 数组数据类型
     代码示例:<!DOCTYPEhtml><html><head><metacharset="utf-8"><title></title></head><body><script>var......