Leetcode-第 73 场双周赛
第一題
題目描述
2190. 數組中緊跟 key 之后出現最頻繁的數字
解題思路
直接尋找就行了
解題代碼
class Solution {public int mostFrequent(int[] nums, int key) {int n = nums.length;int res = 0;int res_count=0;HashMap<Integer,Integer> map = new HashMap<>();for (int i = 0;i<= n-2;i++){if (nums[i]==key){int k = map.getOrDefault(nums[i+1],0)+1;map.put(nums[i+1],k);if (k>res_count){res_count = k;res = nums[i+1];}}}return res;} }第二題
題目描述
2191. 將雜亂無章的數字排序
解題思路
要按照mapping的結果進行排序,因此,把原數字和目標數字封裝對象,根據目標數字編寫Comparator。
解題代碼
class Solution {public int[] sortJumbled(int[] mapping, int[] nums) {ArrayList<P> list = new ArrayList<>();for (int n : nums) {StringBuilder sb = new StringBuilder();for (char c : String.valueOf(n).toCharArray()) {sb.append(mapping[c - 48]);}int tar = Integer.parseInt(sb.toString());list.add(new P(n, tar));}list.sort(new Comparator<P>() {@Overridepublic int compare(P o1, P o2) {return o1.target - o2.target;}});int[] res = new int[nums.length];for (int i = 0; i < nums.length; i++) {res[i] = list.get(i).src;}return res;}}class P {int src;int target;public P(int src, int target) {this.src = src;this.target = target;} }第三題
題目描述
2192. 有向無環圖中一個節點的所有祖先
解題思路
?這是一個深度優先遍歷,在遍歷的時候,可以記錄已經遍歷的節點,避免重復遍歷。
解題代碼
class Solution {private final HashMap<Integer, List<Integer>> map = new HashMap<>();private final HashMap<Integer, List<Integer>> edg = new HashMap<>();public List<List<Integer>> getAncestors(int n, int[][] edges) {// 先把節點加入Map.for (int[] edge : edges) {int start = edge[0];int end = edge[1];List<Integer> l = edg.getOrDefault(end, new ArrayList<Integer>());l.add(start);edg.put(end, l);}List<List<Integer>> res = new ArrayList<>();for (int i = 0; i < n; i++) {// 從 i 開始往上分析。 進行深度有限遍歷List<Integer> list = dfs(i);map.put(i, list);res.add(list);}return res;}private List<Integer> dfs(int n) {if (!edg.containsKey(n)) {// 我是父節點return new ArrayList<>();}if (map.containsKey(n)) {// 此節點已經做過計算,可以直接返回return map.get(n);}// 獲取當前節點的父節點List<Integer> fathers = edg.get(n);HashSet<Integer> temps = new HashSet<>();for (int f : fathers) {temps.addAll(dfs(f));}fathers.addAll(temps);List<Integer> res = new ArrayList<>(new HashSet<>(fathers));Collections.sort(res);map.put(n, res);return res;} }第四題
題目描述
2193. 得到回文串的最少操作次數
?
解題思路
本題沒有做出來,看了大佬的思路,竟然是個貪心。
由于題目保證原串一定可以變成回文串,那么原串中最多只有一種字母出現奇數次。如果有一種字母出現奇數次,那么將該字母中排在最中間的字符移動到字符串中間,剩下的字符可以轉化為所有字母均出現偶數次的情況。
貪心算法是:每次固定字符串最左邊的字母 aa 不變,找出距離字符串右側最近的 aa,把它交換到字符串最右邊。這樣字符串的頭尾字母就相等了。把字符串的頭尾去掉,就變成了子問題。把所有子問題的答案加起來就是最少交換次數。
作者:tsreaper
鏈接:https://leetcode-cn.com/problems/minimum-number-of-moves-to-make-palindrome/solution/tan-xin-zheng-ming-geng-da-shu-ju-fan-we-h57i/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
解題代碼
class Solution {public int minMovesToMakePalindrome(String s) {int n = s.length();if (n <= 2) {return 0;}char c = s.charAt(0);int len = 0;int i;for (i = n - 1; i >= 0; i--) {if (c == s.charAt(i)) {len = n - i - 1;break;}}String sub;if (i==0){len = len/2;sub = s.substring(1);}else {sub = s.substring(1, i) + s.substring(i + 1, n);}return len + minMovesToMakePalindrome(sub);} }總結
以上是生活随笔為你收集整理的Leetcode-第 73 场双周赛的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Leetcode-第 283 场周赛
- 下一篇: 从书上截取一段TCP三次握手和四次挥手