给你个整数数组 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]。这样就可以避开这个问题。