carloscn / structstudy

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

leetcode1502:判断能否形成等差数列(can-make-arithmetic-progression-from-sequence) #237

Open carloscn opened 1 year ago

carloscn commented 1 year ago

问题描述

给你一个数字数组 arr 。

如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 等差数列 。

如果可以重新排列数组形成等差数列,请返回 true ;否则,返回 false 。

示例 1:

输入:arr = [3,5,1] 输出:true 解释:对数组重新排序得到 [1,3,5] 或者 [5,3,1] ,任意相邻两项的差分别为 2 或 -2 ,可以形成等差数列。

示例 2:

输入:arr = [1,2,4] 输出:false 解释:无法通过重新排序得到等差数列。   提示:

2 <= arr.length <= 1000 -10^6 <= arr[i] <= 10^6

来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/can-make-arithmetic-progression-from-sequence

carloscn commented 1 year ago

问题分析

使用排序判断没有意思。这么判断:

pub fn can_make_arithmetic_progression(arr: Vec<i32>) -> bool
{
    if arr.len() < 1 {
        return false;
    }

    let mut d:i32 = 0;

    let mut arr_dup = arr.clone();
    for i in 0..arr_dup.len() {
        for j in 0..arr_dup.len() - i - 1 {
            if arr_dup[j] < arr_dup[j + 1] {
                let t = arr_dup[j];
                arr_dup[j] = arr_dup[j + 1];
                arr_dup[j + 1] = t;
            }
        }
    }

    for i in 0..arr_dup.len() {
        if i == 0 {
            d = arr_dup[i] - arr_dup[i + 1];
        } else if i < arr_dup.len() - 1 {
            if arr_dup[i] - arr_dup[i + 1] != d {
                return false;
            }
        } else {
            return true;
        }
    }

    return true;
}
carloscn commented 1 year ago

code

https://review.gerrithub.io/c/carloscn/structstudy/+/554767 https://github.com/carloscn/structstudy/commit/5a9b8ba840611bbdca33f74749400351ff9da94f