【学习报告】《LeetCode零基础指南》(第五讲) 排序API
目录
一、练习题目
912. 排序数组
169.多数元素
217.存在重复元素
164.最大间距
905.按奇偶排序数组
539.最小时间差
976.三角形的最大周长
881.救生艇
二、答题总结
一、练习题目
912. 排序数组
给你一个整数数组 nums,请你将该数组升序排列。
示例 1:
输入:nums = [5,2,3,1]
输出:[1,2,3,5]
示例 2:输入:nums = [5,1,1,2,0,0]
输出:[0,0,1,1,2,5]
class Solution { public int[] sortArray(int[] nums) { Arrays.sort(nums); return nums; }}
169.多数元素
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入:[3,2,3]
输出:3
示例 2:输入:[2,2,1,1,1,2,2]
输出:2
class Solution { public int majorityElement(int[] nums) { Arrays.sort(nums); return nums[(nums.length)/2]; }}
217.存在重复元素
给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。
示例 1:
输入:nums = [1,2,3,1]
输出:true
示例 2:输入:nums = [1,2,3,4]
输出:false
示例 3:输入:nums = [1,1,1,3,3,4,3,2,4,2]
输出:true
class Solution { public boolean containsDuplicate(int[] nums) { Set res = new HashSet(); for(int i:nums) res.add(i); return res.size()<nums.length?true:false; }}
164.最大间距
给定一个无序的数组 nums,返回 数组在排序之后,相邻元素之间最大的差值 。如果数组元素个数小于 2,则返回 0 。
您必须编写一个在「线性时间」内运行并使用「线性额外空间」的算法。
示例 1:
输入: nums = [3,6,9,1]
输出: 3
解释: 排序后的数组是 [1,3,6,9], 其中相邻元素 (3,6) 和 (6,9) 之间都存在最大差值 3。
示例 2:输入: nums = [10]
输出: 0
解释: 数组元素个数小于 2,因此返回 0。
class Solution { public int maximumGap(int[] nums) { int n=nums.length; if(n<2){ return 0; } Arrays.sort(nums); int max=0; for(int i=1;i=max){ max=nums[i]-nums[i-1]; } } return max; }}
905.按奇偶排序数组
给定一个非负整数数组 A,返回一个数组,在该数组中, A 的所有偶数元素之后跟着所有奇数元素。
你可以返回满足此条件的任何数组作为答案。
示例:
输入:[3,1,2,4]
输出:[2,4,3,1]
输出 [4,2,3,1],[2,4,1,3] 和 [4,2,1,3] 也会被接受。
class Solution { public int[] sortArrayByParity(int[] nums) { int[] arr=new int[nums.length]; int left=0; int right=nums.length-1; for(int n:nums){ if(n % 2==0){ arr[left++]=n; }else{ arr[right--]=n; } } return arr; }}
539.最小时间差
给定一个 24 小时制(小时:分钟 "HH:MM")的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。
示例 1:
输入:timePoints = ["23:59","00:00"]
输出:1
示例 2:输入:timePoints = ["00:00","23:59","00:00"]
输出:0
class Solution { public int findMinDifference(List timePoints) { int[] arr = new int[timePoints.size()]; for (int i = 0; i < arr.length; i++) { arr[i] = Integer.parseInt(timePoints.get(i).substring(0, 2)) * 60 + Integer.parseInt(timePoints.get(i).substring(3)); } Arrays.sort(arr); int min =99999; for (int i = 1; i < arr.length; i++) { min = Math.min(min, arr[i] - arr[i - 1]); } return Math.min(min, arr[0] + 1440 - arr[arr.length - 1]); }}
976.三角形的最大周长
给定由一些正数(代表长度)组成的数组 nums ,返回 由其中三个长度组成的、面积不为零的三角形的最大周长 。如果不能形成任何面积不为零的三角形,返回 0。
示例 1:
输入:nums = [2,1,2]
输出:5
示例 2:输入:nums = [1,2,1]
输出:0
class Solution { public int largestPerimeter(int[] nums) { Arrays.sort(nums); int n=nums.length-1; for(int i = n ;i >= 2; i--) { int a = nums[i]; int b = nums[i - 1]; int c = nums[i - 2]; if(a < b + c){ return a + b + c; } } return 0; }}
881.救生艇
给定数组 people 。people[i]表示第 i 个人的体重 ,船的数量不限,每艘船可以承载的最大重量为 limit。
每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。
返回 承载所有人所需的最小船数 。
示例 1:
输入:people = [1,2], limit = 3
输出:1
解释:1 艘船载 (1, 2)
示例 2:输入:people = [3,2,2,1], limit = 3
输出:3
解释:3 艘船分别载 (1, 2), (2) 和 (3)
示例 3:输入:people = [3,5,3,4], limit = 5
输出:4
解释:4 艘船分别载 (3), (3), (4), (5)
class Solution { public int numRescueBoats(int[] people, int limit) { int res = 0; int right = people.length - 1; int left = 0; Arrays.sort(people); while (left limit) { res++; right--; // 先载最重的, 而且最小的也无法一起载,那么就最重的单独走 } else { res++; right--; // 最重的与最轻的一起走 left++; } } return res; }}
二、答题总结
感谢Java中的sort()函数对今天排序的重大贡献,今天后面题目有看题解,但保证都搞明白了。
今天有学会了怎么使用HashSet,又是一个老师讲过但没用过系列,知道了一些eclipse中的快捷键,如:"shift+alt+s"(快速建立set、get...),"alt+/"(快速补全代码)
又加强了对“双指针”的应用了解,之前做过的题要回顾一下了,感觉一些方法有点忘了,我这颗小菜菜什么时候可以长出“菜花”啊!
注意:三目运算符的使用(好像是叫这个)、Integer.parseInt()函数是将字符串转化为整型的、list.get(i)是返回i处索引、substring()函数是截取出来(前闭后开区间)。