目录
一、练习题目
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<Integer> res = new HashSet<Integer>();
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<n;i++){
if(nums[i]-nums[i-1]>=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<String> 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 <= right) {
if (left == right) {
res++; // 只剩下最后一个,直接一个走,结束
break;
}
if (people[left] + people[right] > 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()函数是截取出来(前闭后开区间)。