LeetCode——第 404 場周賽

周賽

三角形的最大高度

給你兩個整數 red 和 blue,分別表示紅色球和藍色球的數量。你需要使用這些球來組成一個三角形,滿足第 1 行有 1 個球,第 2 行有 2 個球,第 3 行有 3 個球,依此類推。

每一行的球必須是 相同 顏色,且相鄰行的顏色必須 不同。

返回可以實現的三角形的 最大 高度。

示例 1:

輸入: red = 2, blue = 4

輸出: 3

解釋:
在這里插入圖片描述

上圖顯示了唯一可能的排列方式。

解題思路

三角形的首行可能放置紅色球或藍色球,當首行顏色確定之后,三角形的每一行的顏色都可以確定。

對于兩種情況,分別枚舉每一行,計算是否可以使用指定顏色的球完整放置該行,可以使用指定顏色的球完整放置的最大行數即為三角形的最大高度。

class Solution {public int maxHeightOfTriangle(int red, int blue) {return Math.max(getMaxHeight(new int[]{red, blue}), getMaxHeight(new int[]{blue, red}));}public int getMaxHeight(int[] counts) {int height = 0;int position = 0;while (height + 1 <= counts[position]) {height++;counts[position] -= height;position ^= 1;}return height;}
}

找出有效子序列的最大長度 I

給你一個整數數組 nums。

nums 的子序列 sub 的長度為 x ,如果其滿足以下條件,則稱其為 有效子序列:

(sub[0] + sub[1]) % 2 == (sub[1] + sub[2]) % 2 == … == (sub[x - 2] + sub[x - 1]) % 2
返回 nums 的 最長的有效子序列 的長度。

一個 子序列 指的是從原數組中刪除一些元素(也可以不刪除任何元素),剩余元素保持原來順序組成的新數組。

示例 1:

輸入: nums = [1,2,3,4]

輸出: 4

解釋:

最長的有效子序列是 [1, 2, 3, 4]。

解題思路

對于子序列 sub,每對連續元素的和應具有相同的奇偶性

class Solution {public int maximumLength(int[] nums) {int c = nums[0] % 2, odd = 0, even = 0, both = 0;//both 記錄01,10交替出現的長度for (int num: nums){int cur = num % 2;if (cur==0){even++;}else{odd++;}if (cur == c){both++;c^=1;}}return Math.max(both, Math.max(even, odd));}
}

找出有效子序列的最大長度 II

給你一個整數數組 nums 和一個 正 整數 k 。
nums 的一個
子序列
sub 的長度為 x ,如果其滿足以下條件,則稱其為 有效子序列 :

(sub[0] + sub[1]) % k == (sub[1] + sub[2]) % k == … == (sub[x - 2] + sub[x - 1]) % k
返回 nums 的 最長有效子序列 的長度。

示例 1:

輸入:nums = [1,2,3,4,5], k = 2

輸出:5

解釋:

最長有效子序列是 [1, 2, 3, 4, 5] 。

解題思路

通過一個兩層循環,預處理出能與nums[i]產生余數rem的右側第一個nums[j],用哈希表記錄下標j。然后檢查n個起點所有可能的余數對應的最長的子序列長度,由于前述的預處理,我們可以快速地查出來下一個下標,查不出來說明子序列結束。

class Solution {public int maximumLength(int[] nums, int k) {int n = nums.length;Map<Integer, Integer>[] next = new Map[nums.length];Arrays.setAll(next, key -> new HashMap<>());for (int i = 0; i < n; i++) {for (int j = i + 1; j < n; j++) {int rem = (nums[i] + nums[j]) % k;next[i].putIfAbsent(rem, j);}}int[][] memo = new int[n][k + 1];for (var it : memo) {Arrays.fill(it, -1);}int ans = 0;for (int i = 0; i < n; i++) {for (int r : next[i].keySet()) {ans = Math.max(ans, dfs(next, i, r, memo));}}return ans + 1;}private int dfs(Map<Integer, Integer>[] next, int i, int rem, int[][] memo) {if (memo[i][rem] != -1) {return memo[i][rem];}if (!next[i].containsKey(rem)) {return 0;}return memo[i][rem] = 1 + dfs(next, next[i].get(rem), rem, memo);}
}

合并兩棵樹后的最小直徑

給你兩棵 無向 樹,分別有 n 和 m 個節點,節點編號分別為 0 到 n - 1 和 0 到 m - 1 。給你兩個二維整數數組 edges1 和 edges2 ,長度分別為 n - 1 和 m - 1 ,其中 edges1[i] = [ai, bi] 表示在第一棵樹中節點 ai 和 bi 之間有一條邊,edges2[i] = [ui, vi] 表示在第二棵樹中節點 ui 和 vi 之間有一條邊。

你必須在第一棵樹和第二棵樹中分別選一個節點,并用一條邊連接它們。

請你返回添加邊后得到的樹中,最小直徑 為多少。

一棵樹的 直徑 指的是樹中任意兩個節點之間的最長路徑長度。

示例 1:
在這里插入圖片描述

輸入:edges1 = [[0,1],[0,2],[0,3]], edges2 = [[0,1]]

輸出:3

解釋:

將第一棵樹中的節點 0 與第二棵樹中的任意節點連接,得到一棵直徑為 3 得樹。

class Solution {int diameter;public int minimumDiameterAfterMerge(int[][] edges1, int[][] edges2) {int diameter1 = treeDiameter(edges1), diameter2 = treeDiameter(edges2);int semiDiameter1 = (diameter1 + 1) / 2, semiDiameter2 = (diameter2 + 1) / 2;return Math.max(Math.max(diameter1, diameter2), semiDiameter1 + semiDiameter2 + 1);}public int treeDiameter(int[][] edges) {diameter = 0;int n = edges.length + 1;List<Integer>[] adjacentArr = new List[n];List<Integer>[] childrenArr = new List[n];for (int i = 0; i < n; i++) {adjacentArr[i] = new ArrayList<Integer>();childrenArr[i] = new ArrayList<Integer>();}for (int[] edge : edges) {adjacentArr[edge[0]].add(edge[1]);adjacentArr[edge[1]].add(edge[0]);}getTree(adjacentArr, childrenArr, -1, 0);getDepth(childrenArr, 0);return diameter;}public void getTree(List<Integer>[] adjacentArr, List<Integer>[] childrenArr, int parent, int curr) {if (parent >= 0) {childrenArr[parent].add(curr);}List<Integer> adjacent = adjacentArr[curr];for (int next : adjacent) {if (next != parent) {getTree(adjacentArr, childrenArr, curr, next);}}}public int getDepth(List<Integer>[] childrenArr, int node) {List<Integer> children = childrenArr[node];int first = 0, second = 0;for (int child : children) {int depth = getDepth(childrenArr, child);if (depth > first) {second = first;first = depth;} else if (depth > second) {second = depth;}diameter = Math.max(diameter, first + second);}return first + 1;}
}

解題思路

這道題給定兩個無向樹,要求在兩個樹中各選擇一個結點,使用一條邊連接這兩個結點得到合并后的樹,計算合并后的樹的最小直徑。

來源

LeetCode

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/39172.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/39172.shtml
英文地址,請注明出處:http://en.pswp.cn/web/39172.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Go語言--自定義函數

定義格式 函數構成代碼執行的邏輯結構。在 Go語言中&#xff0c;兩數的基本組成為:關鍵字 func、函數名、參數列表、返回值、所數體和返回語句。 函數定義說明: func:函數由關鍵字func開始聲明FuncName:函數名稱&#xff0c;根據約定&#xff0c;數名首字母小寫即為private…

淺談 Linux 中的 core dump 分析方法

文章目錄 一、什么是 core dump二、發生 core dump 的原因1. 空指針或非法指針引起 core dump2. 數組越界或指針越界引起的 core dump3. 數據競爭導致 core dump4. 代碼不規范 三、core dump 分析方法1. 啟用 core dump2. 觸發 core dump2-1. 因空指針解引用而崩潰2-2. 通過 SI…

圖形編輯器基于Paper.js教程06:鼠標畫圓與橢圓

繪制橢圓與圓形&#xff1a;利用Paper.js進行交互式圖形設計 在Web應用中實現交互式圖形繪制功能&#xff0c;對于提高用戶體驗至關重要&#xff0c;尤其是在設計和藝術相關的應用中。Paper.js是一款強大的JavaScript庫&#xff0c;專門用于處理矢量圖形&#xff0c;它提供了一…

智能語音門鎖:置入NV170D語音芯片ic 打造便捷生活新體驗

一、智能門鎖語音芯片開發背景 隨著科技的飛速發展&#xff0c;傳統門鎖的局限性日益凸顯&#xff0c;無法滿足現代人對高效、安全生活的需求。在這樣的時代背景下&#xff0c;智能門鎖應運而生&#xff0c;它不僅繼承了傳統門鎖的基本功能&#xff0c;更通過融入先進的科技元素…

商標的近似分辯,商標起名稱時注意!

曾有過網友發來商標名稱&#xff0c;普推知商標老楊說有近似&#xff0c;然后網友起過新名稱還是存有近似&#xff0c;或者加字&#xff0c;后面加的通用詞&#xff0c;與先有商標名稱也是近似。 “良信健康”這個名稱健康是行業通用詞&#xff0c;加成健康后變成四個字&#x…

出現 images and labels...0 found, xx missing, 0 empty, 0 corrupt 解決方法

目錄 1. 問題所示2. 原理分析3. 解決方法1. 問題所示 訓練VOC的數據的時候出現如下問題: val: Scanning /home/l228/huoyanhao/yolov5/datasets/VOC/images/VOCdevkit/VOC2007/2007_val images and labels...0 found, 2510 missing, 0 empty, 0 corrupt: 100%|███████…

HTTP協議深入

1.了解web和網絡基礎 有客戶端和服務端雙方參與交互 客戶端發送請求:request 服務端根據請求給出響應:response 請求通過URL來指定要獲取都得資源 響應內容可以是HTML網頁&#xff0c;或者用json表示的數據或者其他二進制文件內容 Web使用一種名為HTTP的協議作為規范&…

jEasyUI 添加分頁組件

jEasyUI 添加分頁組件 jEasyUI(jQuery EasyUI)是一個基于jQuery的用戶界面插件集合,它為用戶提供了一系列的UI組件,如菜單、窗口、數據網格等,以簡化Web頁面的開發。分頁組件是jEasyUI中的一個重要部分,它允許用戶在處理大量數據時,將數據分頁顯示,提高用戶體驗和數據…

AI與大模型工程師證書研修班報名啦!

人工智能大模型是指擁有超大規模參數&#xff08;通常在十億個以上&#xff09;、超強計算資源的機器學習模型&#xff0c;能夠處理海量數據&#xff0c;完成各種復雜任務&#xff0c;如自然語言處理、圖像識別等。計算機硬件性能不斷提升&#xff0c;深度學習算法快速優化&…

ESP32CAM物聯網教學03

ESP32CAM物聯網教學03 物聯網小車 小智突發奇想&#xff1a;要是我在點燈物聯APP中多增加幾個按鈕&#xff0c;控制小車的行駛方向&#xff0c;不就可以做成遙控小車了嗎&#xff1f; 點燈物聯控制小車的行駛方向 我們可以重新編輯點燈物聯APP中的設備控件界面&#xff0c;如…

自定義控件之動畫篇(六)——聯合動畫的代碼及xml實現

在Android中&#xff0c;聯合動畫&#xff08;即組合多種類型的動畫&#xff09;可以通過編寫Java/Kotlin代碼或XML資源文件來實現。這里我們將分別展示如何通過這兩種方式來實現一個簡單的自定義控件動畫&#xff0c;該動畫將包含平移和縮放效果。 1. XML 資源文件實現 首先…

AI學習指南機器學習篇-梯度提升樹模型應用與Python實踐

AI學習指南機器學習篇-梯度提升樹模型應用與Python實踐 機器學習領域中的梯度提升樹&#xff08;Gradient Boosting Tree&#xff09;模型是一種非常強大且廣泛應用的模型&#xff0c;它在各種數據類型和問題類型上都表現出色。在本篇博客中&#xff0c;我們將介紹如何使用Pyt…

開關電源中強制連續FCCM模式與輕載高效PSM,PFM模式優缺點對比筆記

文章目錄 前言一、連續FCCM模式優點&#xff1a;缺點&#xff1a; 二,輕載高效PSM&#xff0c;PFM優點&#xff1a;缺點: 總結 前言 今天我們來學習下開關電源中&#xff0c;強制連續FCCM模式與輕載高效PSM&#xff0c;PFM模式優缺點對比 一、連續FCCM模式 優點&#xff1a; …

mac中如何恢復因為破解腳本導致的IDEA無法啟動的問題

問題 為了在mac中安裝免費的2024版idea&#xff0c;導致下載了一個腳本&#xff0c;使用這個腳本后&#xff0c;但是發現idea還沒有破解&#xff0c;相反導致idea無法啟動&#xff0c;每次點擊&#xff0c;都會彈出“cannot start IDE…” 問題排查 在訪達中點擊mac的應用程…

docker -run hello-world超時

主要原因就是嘗試拉取庫的時候沒有從阿里云鏡像里拉&#xff0c;所以設置一下就好了 這里使用的是ubuntu系統&#xff08;命令行下逐行敲就行了&#xff09; sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": [&quo…

什么是生成式人工智能

什么是生成式人工智能 生成式人工智能生成式人工智能的特點生成式人工智能的工作原理生成式人工智能的類型生成式人工智能面臨的挑戰數據要求訓練復雜性控制輸出道德問題監管障礙 生成式人工智能 生成式人工智能是指旨在生成書面文本、音頻、圖像或視頻形式的新內容的人工智能…

Adobe Acrobat添加時間戳服務器

文章目錄 前言一、Adobe Acrobat添加時間戳服務器1.打開Adobe Acrobat軟件2.點擊【菜單】→ 【首選項】3.點擊【安全性】→【更多】4.點擊【新建】5.輸入【名稱】→【服務器URL】 前言 一、Adobe Acrobat添加時間戳服務器 1.打開Adobe Acrobat軟件 2.點擊【菜單】→ 【首選項…

模擬退火算法1——簡介

模擬退火算法來源于固體退火原理&#xff0c;將固體加溫至充分高&#xff0c;再讓其徐徐冷卻&#xff0c;加溫時&#xff0c;固體內部粒子隨溫升變為無序狀&#xff0c;內能增大&#xff0c;而徐徐冷卻時粒子漸趨有序&#xff0c;在每個溫度都達到平衡態&#xff0c;最后在常溫…

[C++][設計模式][訪問器]詳細講解

目錄 1.動機2.模式定義3.要點總結4.代碼感受1.代碼一2.代碼二 1.動機 在軟件構件過程中&#xff0c;由于需求的變化&#xff0c;某些類層次結構中常常需要增加新的行為(方法)&#xff0c;如果直接在基類中做這樣的更改&#xff0c; 將會給子類帶來很繁重的變更負擔&#xff0c…

加密基本知識:密鑰、簽名、證書

一、密碼(clpher) 是一種用于加密或者解密的算法 密碼學中的密碼&#xff08;cipher&#xff09;和我們日常生活中所說的密碼不太一樣&#xff0c;計算機術語『密碼 cipher』是一種用于加密或者解密的算法&#xff0c;而我們日常所使用的『密碼 password』是一種口令&#xff…