carloscn / structstudy

Leetcode daily trainning by using C/C++/RUST programming.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

leetcode1200:最小绝对差(minimum-absolute-difference)

carloscn opened this issue · comments

问题描述

给你个整数数组 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

问题分析

排序之后遍历数组,一边查找最小差 一边遍历数组,

  • 当发现新的最小差更小的时候
    • 把所有记录的数组全部清空,记录新的数组;
    • 更新最小差记录
  • 当发现最小差和记录的最小差相等的时候
    • 录入新的最小差数组
  • 当发现最小差和和记录最小差更大的时候
    • 跳过
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;
}