一、题目引出
问题:给你个整数数组 arr
,其中每个元素都 不相同。请你找到所有具有最小绝对差的元素对,并且按升序的顺序返回。
例:
输入:arr = [4,2,1,3]
输出:[[1,2],[2,3],[3,4]]
输入:arr = [1,3,6,10,15]
输出:[[1,3]]
这次题目也是在数组上面进行操作,通过几次题目可以看出来对于数组的使用还是挺重要的。
二、解题思路
首先看题目中按升序返回,就很容易想到几种对于数组元素排序的方法——冒泡排序、快排、插入排序等;此处我用的是冒泡排序;除此之外,我相信很多人都是卡在这个List<List<Integer>>上,它跟二维数组十分相似,但不是像二维数组那样维度固定,因此可以用它来保存具有最小绝对差的元素对。
三、List<List<Integer>>用法
创建:
List<List<元素类型>> 数组名=new ArrayList<List<元素类型>>();
例如:
List<List<Integer>> listList=new ArrayList<List<Integer>>()
存放数据(添加)
List<Integer> list = new ArrayList<>(); list.add(1);//将元素1加入到list数组中 listList.add(list);//将数组list加入到数组listList中,也就是数组的数组
读取数组中元素
listList.get(1).get(2) ; //先get行号,后get 列号
一维数组读取某一位元素:直接用get(num),其中num代表要读取哪一位
四、源代码
package LeetCode; import java.util.ArrayList; import java.util.List; import java.util.Scanner; class Solution { public static void bubbeSort(int []arry){ //冒泡排序 int temp; for(int i=0;i<arry.length;i++){ for(int j=arry.length-1;j>i;j--){ if(arry[i+1]<arry[i]){ temp=arry[i+1]; arry[i+1]=arry[i]; arry[i]=temp; } } } } public static List<List<Integer>> minimumAbsDifference(int[] arr) { bubbeSort(arr); //找出最小绝对差 int min = arr[1] - arr[0]; for (int i=2;i<arr.length;i++){ if(arr[i]-arr[i-1]<min){ min=arr[i]-arr[i-1]; } } //向数组listList中存放数据 List<List<Integer>> listList = new ArrayList<>(); for (int i=1; i<arr.length; i++) { if (min == arr[i] - arr[i-1]) { List<Integer> list = new ArrayList<>(); list.add(arr[i-1]);//将元素加入到数组中 list.add(arr[i]); listList.add(list);//将数组list加入到listList中 } } return listList; } public static void main(String args[]){ Scanner input = new Scanner(System.in); int []arr1 = new int[4]; System.out.println("向数组中输入四个元素:"); for(int i =0 ; i<arr1.length;i++){ arr1[i] = input.nextInt(); } bubbeSort(arr1); System.out.println("具有最小绝对差的元素对:"); System.out.println(minimumAbsDifference(arr1)); } }
五、总结
通过几次的做题发现,题目的出发都是千变万化,而且总会有你的知识盲区,所以还是得掌握好基础,这样才能避免做一个,第二个还是不会;同样每天得积累非常的重要,慢慢得知识盲区也一定会随之减少,所以我们一定要坚持每天学一点知识,累计成一座知识得大山。