0
点赞
收藏
分享

微信扫一扫

Java 第 21 课 1200. 最小绝对差 539. 最小时间差



第 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);


举报

相关推荐

0 条评论