leetcode刷題 495~
阿新 • • 發佈:2020-12-07
題目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(); */