题目描述
给定一个数组,求这个数组中最小的绝对值;如果存在多个则按照升序返回结果。
示例1:
输入:arr = [4,2,1,3]
输出:[[1,2],[2,3],[3,4]]
解释:2和1的绝对值是1;3和2的绝对值是1,4和3的绝对值是1.
解题思路
这个题可以直接做排序操作,对排序后相邻数字做取绝对值计算;
针对示例1,流程如下:
对arr = [4,2,1,3]进行排序,得到结果:[1,2,3,4]
对[1,2],[2,3],[3,4]求取绝对值;
取其中最小的结果加到list中;
代码实现
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
class Solution {
public List<List<Integer>> minimumAbsDifference(int[] arr) {
Arrays.sort(arr);
// int v = Math.abs(arr[1] - arr[0]);
// 这里不要用Math.abs,排序结果必然大的数字在前小的在后面
int v = arr[1] - arr[0];
List<List<Integer>> res = new ArrayList<>();
res.add(Arrays.asList(arr[0], arr[1]));
for (int i = 2; i < arr.length; i++) {
// int newV = Math.abs(arr[i] - arr[i - 1]);
// 这里不要用Math.abs,排序结果必然大的数字在前小的在后面
int newV = arr[i] - arr[i - 1];
if (v == newV) {
res.add(Arrays.asList(arr[i - 1], arr[i]));
} else if (v > newV) {
v = newV;
res = new ArrayList<>();
res.add(Arrays.asList(arr[i - 1], arr[i]));
} else {
continue;
}
}
return res;
}
public static void main(String[] args) {
Solution solution = new Solution();
List<List<Integer>> list = solution.minimumAbsDifference(new int[]{40, 11, 26, 27, -20});
System.out.println(list);
}
}
总结
这道题是一道简单的排序+求最小值的题目,有空练习一下。整个时间复杂度最高的就是排序操作,理论上是O(n*log(n)); 求最小值是一次遍历操作:O(n)