carloscn / structstudy

Leetcode daily trainning by using C/C++/RUST programming.
4 stars 1 forks source link

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

Open carloscn opened 1 year ago

carloscn commented 1 year ago

问题描述

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

carloscn commented 1 year ago

问题分析

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


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;
}
carloscn commented 1 year ago

code

https://github.com/carloscn/structstudy/commit/efed0e9bd59bd348be1c1e2b0ec99ec44f99934a https://review.gerrithub.io/c/carloscn/structstudy/+/552967