下面这段代码是将输入的数字进行排序后,将排好的序号替换掉原来数组中元素位置上的值。
例如
求优化下列代码。运行时间长,效率不高。
class Solution {
public int[] arrayRankTransform(int[] arr) {
int i, j, k;
int arr_a[] = arr;
HashSet 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;
}
}
你的算法慢是因为:
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;
}
}
第一个是5,第二个为什么是3???
for那一段冒泡排序,可以直接替换成sort快排,leetcode里面好像自己有这个函数的。sort会快一些。默认就是升序