LeetCode - 1200- 最小绝对差

给你个整数数组 arr,其中每个元素都 不相同。请你找到所有具有最小绝对差的元素对,并且按升序的顺序返回。

示例:

输入:arr = [4,2,1,3]
输出:[[1,2],[2,3],[3,4]]
输入:arr = [1,3,6,10,15]
输出:[[1,3]]

解决方法:

循环遍历数组,找到 最小值,然后再循环,返回找到差值与最小值相同的两个数。

问题:

1、怎么只返回两个数?

        首先想到的是用list.add()去添加与min相等的两个数,但是最后在集合里面的是一个数组 -> [[1,3]].这里用到了list.clear()函数,清空list里值,这样就可以实现添加完两个元素后把list清空,当下次添加时又是新的两个数,就得到了每次只添加两个数。

2、怎么升序返回这两个数?

        我们可以先对arr进行递增排序,这样就能实现我在最开始添加的时候就是以递增方式添加。而且先进行排序还有个好处,我可以一次循环就可以找到最小值,这样我们就可以确定相邻元素之间的差值。(这里我开始用双层循环找时,时间超时,emmm,没想通是为什么。)

输入:10,11 ,13,11     

不进行排序  -> min = 1

排序后: 10,11,11,13 -> min = 0

3、怎么将一个数组放入到List中? ->这样色的( [[1,3]] )。

List<Integer> list = new ArrayList<>();

List<List<Integer>> res = new ArrayList<>();

 res.add(new ArrayList<>( list));

当我们在list里添加2个数后,再插入到res中,就得到了数组式数据。


代码部分:

package Class02;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 最小绝对值之差 !!
 */
public class LeetCode_1200_MinAbsoluteDiffrence {

    public List<List<Integer>> MinAbsoluteDiffrence (int [] arr){

        List<Integer> list = new ArrayList<>();
        List<List<Integer>> res = new ArrayList<>();
        //提前排序就可以实现最后添加到结合中的数据是递增的
        Arrays.sort(arr);
        int min = Math.abs( arr[1] - arr[0]);
        //使用i+1的话会越界,但用i-1就不会!!!
        //开始一直好奇为什么可以一次循环就可以找到最小值,是因为数组已经排序了,这样相邻元素间的差值就是最小的
        for(int i=1;i<arr.length;i++){
            if(Math.abs(arr[i-1] - arr[i]) < min){
                min = Math.abs(arr[i] - arr[i-1]);
            }
        }
        for(int i=1;i<arr.length;i++){
            //clear 是为了实现每次list里面只存放2个数据,这样就可以添加两个数值对。
            if(Math.abs(arr[i-1] - arr[i]) == min){
                list.clear();
                list.add(arr[i-1]);
                list.add(arr[i]);
                res.add(new ArrayList<>(list)); //在List中添加List的方式!
                list.clear();
            }
        }
        return res;
    }
}

 

心得:本例里面比较得到最小值时,由于是相邻元素之间比较,最开始想到的是 arr[i] - arr[i+1] 但是这样会越界,所以变成 arr[i] -arr [i-1]。这样就可以避开这个问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值