1. 程式人生 > 實用技巧 >leetcode刷題 495~

leetcode刷題 495~

題目495題

提莫攻擊

在《英雄聯盟》的世界中,有一個叫 “提莫” 的英雄,他的攻擊可以讓敵方英雄艾希(編者注:寒冰射手)進入中毒狀態。現在,給出提莫對艾希的攻擊時間序列和提莫攻擊的中毒持續時間,你需要輸出艾希的中毒狀態總時長。

你可以認為提莫在給定的時間點進行攻擊,並立即使艾希處於中毒狀態。

示例1:

輸入: [1,4], 2
輸出: 4
原因: 第 1 秒初,提莫開始對艾希進行攻擊並使其立即中毒。中毒狀態會維持 2 秒鐘,直到第 2 秒末結束。
第 4 秒初,提莫再次攻擊艾希,使得艾希獲得另外 2 秒中毒時間。
所以最終輸出 4 秒。

思路

雙指標

實現

class Solution {
    
public int findPoisonedDuration(int[] timeSeries, int duration) { int result = 0; int left = 0; int right = 0; for (int time: timeSeries){ if (time >= right){ result += duration; left = time; right = left + duration; }
else{ left = time; result = result + duration + left - right; right = left + duration; } } return result; } }

題目496題

下一個更大的元素I

給定兩個 沒有重複元素 的陣列nums1 和nums2,其中nums1是nums2的子集。找到nums1中每個元素在nums2中的下一個比其大的值。

nums1中數字x的下一個更大元素是指x在nums2中對應位置的右邊的第一個比x大的元素。如果不存在,對應位置輸出 -1 。

示例 1:

輸入: nums1 = [4,1,2], nums2 = [1,3,4,2].
輸出: [-1,3,-1]

思路

單調棧:首先遍歷nums2,利用雜湊表記錄每個元素下一個更大值。然後遍歷nums1獲取結果

實現

class Solution {
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        Stack < Integer > stack = new Stack<>();
        HashMap < Integer, Integer > map = new HashMap < > ();
        for(int num: nums2){
            while(! stack.empty() && stack.peek()<num){
                map.put(stack.pop(), num);
            }
            stack.push(num);
        }
        while(!stack.empty()){
            map.put(stack.pop(),-1);
        }
        int[] result = new int[nums1.length];
        for(int i = 0; i < nums1.length; i++){
            result[i] = map.get(nums1[i]);
        }
        return result;
    }
}

題目497題

非重疊矩陣中的隨機點

給定一個非重疊軸對齊矩形的列表rects,寫一個函式pick隨機均勻地選取矩形覆蓋的空間中的整數點。

示例 1:

輸入:
["Solution","pick","pick","pick"]
[[[[1,1,5,5]]],[],[],[]]
輸出:
[null,[4,1],[4,1],[3,3]]

思路

首先計算所有整數點的總和,然後採用蓄水池抽樣,或者二分查詢,找到隨機點。

實現

import java.util.Random;
class Solution {
    
    private int[][] rects;
    private int rectsNum = 0;
    private List<Integer> rectArray = new ArrayList<>();
    public Solution(int[][] rects) {
        this.rects = rects;
        for (int[] rect: rects){
            rectsNum += (rect[2] - rect[0] + 1)*(rect[3] - rect[1] + 1);
            rectArray.add(rectsNum);
        }
    }

    public int[] pick() {
        Random random =new Random();
        int randomIndex = random.nextInt(rectsNum);
        int left = 0;
        int right = rects.length-1;
        while(left != right){
            int mid = left + (right-left)/2;
            if(randomIndex >= rectArray.get(mid)){
                left = mid +1;
            }
            else{
                right = mid;
            }
        }
        int rectsIndex = left;
        int[] rect = rects[rectsIndex];
        int length = rect[2] - rect[0] + 1;
        int high = rect[3] - rect[1] + 1;
        int lengthIndex = random.nextInt(length);
        int highIndex = random.nextInt(high);
        int[] result = new int[2];
        result[0] = rect[0] + lengthIndex;
        result[1] = rect[1] + highIndex;
        return result;
    }
}

/**
 * Your Solution object will be instantiated and called as such:
 * Solution obj = new Solution(rects);
 * int[] param_1 = obj.pick();
 */

題目495題

思路實現

題目495題

思路實現

題目495題

思路實現

題目495題

思路實現

題目495題

思路實現

題目495題

思路實現

題目495題

思路實現

題目495題

思路實現

題目495題

思路實現

題目495題

思路實現

題目495題

思路實現

題目495題

思路實現

題目495題

思路實現

題目495題

思路實現