leetcode1200:最小绝对差(minimum-absolute-difference)
carloscn opened this issue · comments
Carlos Wei (Haochen) commented
问题描述
给你个整数数组 arr,其中每个元素都 不相同。
请你找到所有具有最小绝对差的元素对,并且按升序的顺序返回。
每对元素对 [a,b] 如下:
a , b 均为数组 arr 中的元素
a < b
b - a 等于 arr 中任意两个元素的最小绝对差
示例 1:
输入:arr = [4,2,1,3]
输出:[[1,2],[2,3],[3,4]]
示例 2:
输入:arr = [1,3,6,10,15]
输出:[[1,3]]
示例 3:
输入:arr = [3,8,-10,23,19,-4,-14,27]
输出:[[-14,-10],[19,23],[23,27]]
提示:
2 <= arr.length <= 10^5
-10^6 <= arr[i] <= 10^6
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/minimum-absolute-difference
Carlos Wei (Haochen) commented
问题分析
排序之后遍历数组,一边查找最小差 一边遍历数组,
- 当发现新的最小差更小的时候
- 把所有记录的数组全部清空,记录新的数组;
- 更新最小差记录
- 当发现最小差和记录的最小差相等的时候
- 录入新的最小差数组
- 当发现最小差和和记录最小差更大的时候
- 跳过
pub fn minimum_abs_difference(arr: Vec<i32>) -> Vec<Vec<i32>>
{
let mut ret_vec:Vec<Vec<i32>> = vec![];
let mut in_vec:Vec<i32> = arr.clone();
in_vec.sort();
if arr.len() < 2 {
return ret_vec;
} else if arr.len() == 2 {
ret_vec.push(in_vec);
return ret_vec;
}
let mut r_min_diff:i32 = 0x7FFFFFFF;
for i in 0..arr.len() - 1 {
let e = in_vec[i + 1] - in_vec[i];
let sub_vec:Vec<i32> = vec![in_vec[i], in_vec[i + 1]];
if e > r_min_diff {
continue;
} else if e == r_min_diff {
ret_vec.push(sub_vec);
} else {
ret_vec.clear();
r_min_diff = e;
ret_vec.push(sub_vec);
}
}
return ret_vec;
}