兰舟千帆 2022-07-28 13:13 采纳率: 76.2%
浏览 85
已结题

优化一段代码,主要是for循环。希望减少运行时间。

下面这段代码是将输入的数字进行排序后,将排好的序号替换掉原来数组中元素位置上的值。

例如

img

求优化下列代码。运行时间长,效率不高。

class Solution {
    public int[] arrayRankTransform(int[] arr) {
        int i, j, k;
       
        int arr_a[] = arr;
        HashSet<Integer> set = new HashSet<>();

//        for (int i1 : arr_a) {
//            System.out.println(i1);
//
//        }

        for (int x = 0; x < arr.length; x++) {
            set.add(arr_a[x]);
        }
        Integer arr_b[] = set.toArray(set.toArray(new Integer[]{}));

        for (i = 0; i < arr_b.length - 1; i++) {
            for (j = 0; j < arr_b.length - i - 1; j++) {
                if (arr_b[j] > arr_b[j + 1]) {
                    k = arr_b[j];
                    arr_b[j] = arr_b[j + 1];
                    arr_b[j + 1] = k;
                }
            }

        }
       
        for (int i1 = 0; i1 < arr.length; i1++) {
            for (int i2 = 0; i2 < arr_b.length; i2++) {
                if (arr[i1] == arr_b[i2]) {
                    arr[i1] = i2 + 1;
                    break;

                }

            }


        }
        return arr;

    }
}

  • 写回答

3条回答 默认 最新

  • miaoch 2022-07-28 16:50
    关注

    你的算法慢是因为:

    1. 你用的排序算法是O(n^2), 可以直接用Arrays.sort()优化。
    2. 你最后获取序号的算法也是O(n^2), 可以用哈希表优化成O(n)
    
    class Solution {
        public int[] arrayRankTransform(int[] arr) {
            int[] arr_copy = Arrays.copyOf(arr, arr.length);
            Arrays.sort(arr_copy);
            Map<Integer, Integer> record = new HashMap<>();
            int index = 1;
            for (int num : arr_copy) {
                if (!record.containsKey(num)) {
                    record.put(num, index++);
                }
            }
            for (int i=0; i<arr.length; ++i) {
                arr[i] = record.get(arr[i]);
            }
            return arr;
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 8月5日
  • 已采纳回答 7月28日
  • 创建了问题 7月28日

悬赏问题

  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误