第 21 课
- 1200. 最小绝对差
- 539. 最小时间差
- 基础知识
- Java ArrayList 方法
- List.of 和 Arrays.asList
- ArrayList 排序
1200. 最小绝对差
Leetcode知识点: Arrays.sort(), List, add, clear()
class Solution:
def minimumAbsDifference(self, arr: List[int]) -> List[List[int]]:
arr.sort()
min_, res = inf, []
for i in range(1, len(arr)):
a, b = arr[i-1], arr[i]
if (x := b - a) < min_: # 因为有序, x >= 0
res = [[a, b]] # 遇到更小的重新开始
min_ = x
elif x == min_:
res.append([a, b])
return res
class Solution {
public List<List<Integer>> minimumAbsDifference(int[] arr) {
Arrays.sort(arr);
List<List<Integer>> lists = new ArrayList<>();
int min = Integer.MAX_VALUE;
for(int i = 1; i < arr.length; i++){
int x = arr[i] - arr[i-1];
if (x <= min) {
if (x < min) lists.clear();
lists.add(List.of(arr[i-1], arr[i]));
min = x;
}
}
return lists;
}
}
539. 最小时间差
Leetcode
class Solution:
def findMinDifference(self, timePoints: List[str]) -> int:
res, z = inf, ord('0')
# timePoints.sort(key=lambda x:int(x[:2]) * 60 + int(x[3:]))
timePoints.sort() # 直接排序就可以
t = timePoints[0]
# one = pre = int(t[:2]) * 60 + int(t[3:])
one = pre = ((ord(t[0]) - z) * 10 + ord(t[1]) - z) * 60 + (ord(t[3]) - z) * 10 + ord(t[4]) - z
for s in timePoints[1:]:
# cur = int(s[:2]) * 60 + int(s[3:])
cur = ((ord(s[0]) - z) * 10 + ord(s[1]) - z) * 60 + (ord(s[3]) - z) * 10 + ord(s[4]) - z
res = min(res, cur - pre)
pre = cur
return min(res, 1440 - (cur - one))
class Solution {
public int findMinDifference(List<String> timePoints) {
Collections.sort(timePoints);
int res = Integer.MAX_VALUE;
int one = getMinutes(timePoints.get(0));
int pre = one, cur;
for (int i = 1; i < timePoints.size(); ++i) {
cur = getMinutes(timePoints.get(i));
res = Math.min(res, cur - pre); // 相邻时间的时间差
pre = cur;
}
res = Math.min(res, 1440 + one - pre); // 首尾时间的时间差
return res;
}
public int getMinutes(String s) {
// return ((s.charAt(0) - '0') * 10 + (s.charAt(1) - '0')) * 60 + (s.charAt(3) - '0') * 10 + (s.charAt(4) - '0');
return Integer.parseInt(s.substring(0, 2)) * 60 +Integer.parseInt(s.substring(3));
}
}
基础知识
Java ArrayList 方法
add() 将元素插入到指定位置的 arraylist 中
addAll() 添加集合中的所有元素到 arraylist 中
get() 通过索引值获取 arraylist 中的元素
set() 替换 arraylist 中指定索引的元素
contains() 判断元素是否在 arraylist
containsAll() 查看 arraylist 是否包含指定集合中的所有元素
indexOf() 返回 arraylist 中元素的索引值
lastIndexOf() 返回指定元素在 arraylist 中最后一次出现的位置
remove() 删除 arraylist 里的单个元素
removeAll() 删除存在于指定集合中的 arraylist 里的所有元素
removeIf() 删除所有满足特定条件的 arraylist 元素
removeRange() 删除 arraylist 中指定索引之间存在的元素
clear() 删除 arraylist 中的所有元素
List.of 和 Arrays.asList
1、Arrays.asList 返回可变的 list,而 List.of 返回的是不可变的 list。
jshell> List<Integer> a = Arrays.asList(1,2,null);
jshell> a.set(1, 10)
jshell> List<Integer> b = List.of(1,2,null)
| 异常错误 java.lang.NullPointerException
jshell> List<Integer> b = List.of(1,2,3)
jshell> b.set(1,4)
| 异常错误 java.lang.UnsupportedOperationException
2、Arrays.asList 支持 null,而 List.of 支持,它们的 contains 方法对 null 处理不一样。
jshell> a.contains(null)
$26 ==> true
jshell> b.contains(null)
| 异常错误 java.lang.NullPointerException
3、Arrays.asList:数组的修改会影响原数组。
jshell> Integer[] arr = {1,2,3}
jshell> List<Integer> a = Arrays.asList(arr)
jshell> arr[1] = 10 // arr 与 a 互相影响
jshell> a
a ==> [1, 10, 3]
jshell> a.set(1, 7)
jshell> a
a ==> [1, 7, 11]
jshell> arr
arr ==> Integer[3] { 1, 7, 11 }
jshell> List<Integer> b = List.of(arr)
jshell> arr[1] = 2 // arr 与 a 互不影响
jshell> b
b ==> [1, 10, 3]
ArrayList 排序
Collections 类也是一个非常有用的类,位于 java.util 包中,提供的 sort() 方法可以对字符或数字列表进行排序。
以下实例对字母进行排序:
import java.util.ArrayList;
import java.util.Collections;
ArrayList<String> sites = new ArrayList<String>();
sites.add("Taobao");
sites.add("Wiki");
sites.add("Weibo");
sites.add("Google");
Collections.sort(sites); // 字母排序
for (String i : sites) System.out.println(i);
以下实例对数字进行排序:
import java.util.ArrayList;
import java.util.Collections;
ArrayList<Integer> myNumbers = new ArrayList<Integer>();
myNumbers.add(33);
myNumbers.add(15);
myNumbers.add(20);
myNumbers.add(34);
Collections.sort(myNumbers);
for (int i : myNumbers) System.out.println(i);