【LeetCode題解】2809. 使數組和小于等于 x 的最少時間+2788. 按分隔符拆分字符串+410. 分割數組的最大值

文章目錄

        • [2809. 使數組和小于等于 x 的最少時間](https://leetcode.cn/problems/minimum-time-to-make-array-sum-at-most-x/)
          • 思路:
        • [2788. 按分隔符拆分字符串](https://leetcode.cn/problems/split-strings-by-separator/)
          • 思路:
        • [410. 分割數組的最大值](https://leetcode.cn/problems/split-array-largest-sum/)
            • 思路:二分查找+貪心

2809. 使數組和小于等于 x 的最少時間

在這里插入圖片描述

思路:
  1. 獲取兩個列表的長度n,并初始化一個二維數組f,用于存儲最優解。
  2. 定義一個二維數組nums,用于存儲輸入的兩個列表中的元素,并按照第二列元素進行排序。
  3. 使用動態規劃的方法,通過遍歷nums數組,計算最優解。其中,f[i][j]表示將前i個元素分配到j個集合中時的最大總和。通過比較f[i-1][j]和f[i-1][j-1]+a+b*j的大小,更新f[i][j]。
  4. 計算兩個列表中所有元素的和,分別存儲在s1和s2中。
  5. 遍歷0至n的范圍,判斷是否滿足條件s1 + s2 * j - f[n][j] <= x,若滿足則返回j。
  6. 若沒有滿足條件的j值,則返回-1
class Solution {public int minimumTime(List<Integer> nums1, List<Integer> nums2, int x) {int n = nums1.size();int[][] f = new int[n + 1][n + 1]; // 定義二維數組f,用于存儲最優解int[][] nums = new int[n][0]; // 定義二維數組nums,用于存儲輸入的兩個列表中的元素for (int i = 0; i < n; ++i) {nums[i] = new int[] {nums1.get(i), nums2.get(i)}; // 將輸入的兩個列表中的元素按照相同的索引放入nums數組中}Arrays.sort(nums, Comparator.comparingInt(a -> a[1])); // 根據nums數組中第二列的元素進行排序for (int i = 1; i <= n; ++i) {for (int j = 0; j <= n; ++j) {f[i][j] = f[i - 1][j]; // 初始化f[i][j]為f[i-1][j]if (j > 0) { // 當j大于0時,進行以下操作int a = nums[i - 1][0], b = nums[i - 1][1];f[i][j] = Math.max(f[i][j], f[i - 1][j - 1] + a + b * j); // 更新f[i][j],取當前值與f[i-1][j-1]+a+b*j的較大值}}}int s1 = 0, s2 = 0;for (int v : nums1) {s1 += v; // 計算nums1列表中所有元素的和,存儲在s1中}for (int v : nums2) {s2 += v; // 計算nums2列表中所有元素的和,存儲在s2中}for (int j = 0; j <= n; ++j) {if (s1 + s2 * j - f[n][j] <= x) { // 判斷是否滿足條件 s1 + s2 * j - f[n][j] <= xreturn j; // 返回滿足條件的j值}}return -1; // 若沒有滿足條件的j值,則返回-1}
}
2788. 按分隔符拆分字符串

在這里插入圖片描述

思路:
  1. 對于每個單詞,使用一個可變字符串 StringBuilder 來構建拆分后的單詞。初始時,可變字符串為空。
  2. 遍歷每個單詞的每個字符,如果遇到指定的分隔符,就將可變字符串中的字符構成一個新的單詞,并將其添加到結果列表中。然后清空可變字符串,準備構建下一個單詞。
  3. 如果遇到的不是分隔符,則將當前字符添加到可變字符串中。
  4. 最后,如果可變字符串非空,則說明最后一個單詞還沒有添加到結果列表中,因此需要將其添加到結果列表中。
  5. 返回拆分后的結果列表。
//2788. 按分隔符拆分字符串public List<String> splitWordsBySeparator(List<String> words, char separator) {// 創建一個新的字符串列表,用于存儲拆分后的結果List<String> res = new ArrayList<>();// 遍歷原始字符串列表中的每個單詞for (String word : words) {// 創建一個可變字符串,用于構建拆分后的單詞StringBuilder sb = new StringBuilder();// 獲取當前單詞的長度int length = word.length();// 遍歷當前單詞的每個字符for (int i = 0; i < length; i++) {// 獲取當前字符char c = word.charAt(i);// 如果當前字符是分隔符if (c == separator) {// 如果可變字符串不為空,則將其添加到結果列表中,并清空可變字符串if (sb.length() > 0) {res.add(sb.toString());sb.setLength(0);}} else {// 如果當前字符不是分隔符,則將其添加到可變字符串中sb.append(c);}}// 如果可變字符串不為空,則將其添加到結果列表中if (sb.length() > 0) {res.add(sb.toString());}}// 返回拆分后的字符串列表return res;}
410. 分割數組的最大值

在這里插入圖片描述

思路:二分查找+貪心

利用二分查找法和貪心算法來求解將數組分割為m個非空連續子數組,使得每個子數組的和的最大值最小

  1. 首先,我們需要確定二分查找的左右邊界。左邊界left初始化為數組中的最大值,右邊界right初始化為數組所有元素的總和。
  2. 然后,我們使用二分查找法在左右邊界之間查找滿足條件的最小子數組和。
  3. 在每次迭代中,我們計算中間值mid,然后調用check函數判斷以mid為目標值是否能將數組nums分割成不超過m個子數組。如果能,則將右邊界更新為mid,因為我們要尋找更小的子數組和。如果不能,則將左邊界更新為mid + 1,因為mid不滿足條件,我們需要嘗試更大的值。
  4. 當左邊界left不小于右邊界right時,二分查找結束,最終的結果即為左邊界的值。
  5. 最后,返回左邊界的值作為最小子數組和。
public int splitArray(int[] nums, int m) {int left = 0, right = 0;// 初始化左右邊界for (int i = 0; i < nums.length; i++) {right += nums[i];if (left < nums[i]) {left = nums[i];}}// 使用二分查找法尋找最小的子數組和while (left < right) {int mid = (right - left) / 2 + left;if (check(nums, mid, m)) {right = mid;} else {left = mid + 1;}}// 返回最小的子數組和return left;
}public boolean check(int[] nums, int x, int m) {int sum = 0;int cnt = 1;// 統計滿足條件的子數組個數for (int i = 0; i < nums.length; i++) {if (sum + nums[i] > x) {// 當前元素加上之后超過了目標值,需要分割出一個新的子數組cnt++;sum = nums[i];} else {// 將當前元素加入到當前子數組中sum += nums[i];}}// 判斷最終的子數組個數是否小于等于目標個數return cnt <= m;
}

check函數中,遍歷數組nums,累加元素值到sum變量中,如果累加和超過了目標值x,則說明當前子數組和超過了目標值,需要分割出一個新的子數組,同時將子數組計數cnt增加1,并將sum重置為當前元素值。如果累加和未超過目標值,則將當前元素加入到當前子數組中。

最后,判斷最終的子數組個數cnt是否小于等于目標個數m,如果是則返回true,否則返回false

通過不斷調整二分查找的左右邊界,可以找到滿足條件的最小子數組和

點擊移步博客主頁,歡迎光臨~

偷cyk的圖

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

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

相關文章

Leetcoder Day36| 動態規劃part03

343. 整數拆分 給定一個正整數 n&#xff0c;將其拆分為至少兩個正整數的和&#xff0c;并使這些整數的乘積最大化。 返回你可以獲得的最大乘積。 示例 1: 輸入: 2輸出: 1解釋: 2 1 1, 1 1 1。 示例 2: 輸入: 10輸出: 36解釋: 10 3 3 4, 3 3 4 36。說明: 你可以假設 …

如何提取圖片中某個位置顏色的RGB值,RGB十進制值與十六進制的轉換

打開本地的畫圖工具&#xff0c;把圖片復制或截圖粘進去&#xff0c;用顏色提取器點對應的位置就可以提取了。 獲取到的 RGB 值為 (66,133,244) 轉化后的值為 #4285F4。 【內容拓展一】&#xff1a;RGB 十進制值與十六進制的轉換 當我們從 RGB 十進制值轉換為十六進制值時&a…

Yapi部署

【GO開發工程師】Yapi部署 推薦個人主頁&#xff1a;席萬里的個人空間 文章目錄 【GO開發工程師】Yapi部署1、Yapi部署 1、Yapi部署 初始化yapi&#xff1a; git clone https://github.com/Ryan-Miao/docker-yapi.git cd docker-yapi docker-compose upyapi啟動失敗 1.cd進入…

粉絲福利-純凈Windows系統安裝鏡像下載網站

?Windows操作系統鏡像文件是從微軟或其他經過驗證的來源下載正版操作系統安裝介質的關鍵所在。以下是詳細闡述從不同渠道獲取Windows系統鏡像的說明,尤其強調官方和安全的下載途徑。Windows系統鏡像可以從多個可靠來源下載,以下是幾個推薦的選擇: 微軟官方網站 微軟官方網…

對于《幻獸帕魯》這樣的游戲,如何優化服務器性能以提高游戲體驗?

對于《幻獸帕魯》這樣的游戲&#xff0c;如何評估和優化服務器性能以提高游戲體驗&#xff1f; 硬件配置優化&#xff1a;選擇高性能的服務器&#xff0c;如4核16G的幻獸帕魯服務器&#xff0c;這樣可以保證有足夠的計算性能和內存容量來支持游戲的運行。同時&#xff0c;考慮到…

Node.js(六)-數據庫與身份認證

一 、學習目標 ◆ 能夠知道如何配置MySQL數據庫環境 ◆ 能夠認識并使用常見的 SQL語操作數據庫 ◆ 能夠在Express中操作MySQL數據庫 ◆ 能夠了解 Session的實現原理 ◆ 能夠了解JWT的實現原理 二、數據庫的基本概念 1.1 什么是數據庫 數據庫&#xff08;database&#xff09;…

邊緣計算網關的重要作用-天拓四方

隨著物聯網技術的迅猛發展&#xff0c;數據量的爆炸式增長對數據處理和分析提出了更高的要求。邊緣計算網關作為連接物理世界和數字世界的橋梁&#xff0c;正逐漸受到各行業的重視。本文將從行業背景、功能特點以及帶來的效益等方面&#xff0c;探討邊緣計算網關在當前及未來的…

備戰藍橋杯---狀態壓縮DP基礎2之TSP問題

先來一個題銜接一下&#xff1a; 與上一題的思路差不多&#xff0c;不過這里有幾點需要注意&#xff1a; 1.因為某一列的狀態還與上上一行有關&#xff0c;因此我們令f[i][j][k]表示第i行狀態為j,第i-1行狀態為k的最大炮兵數。 因此&#xff0c;我們可以得到狀態轉移方程&…

2024/03/01

控制機械臂 #include<myhead.h> #define SER_IP "192.168.126.2" #define SER_PORT 8888#define CLI_IP "192.168.252.165" #define CLI_PORT 9999int main(int argc, const char *argv[]) {int cfdsocket(AF_INET,SOCK_STREAM,0);if(cfd-1){perror…

成功解決git clone遇到的error: RPC failed; curl 16 Error in the HTTP2 framing layer fatal: expected flush af

成功解決git clone遇到的error: RPC failed; curl 16 Error in the HTTP2 framing layer fatal: expected flush af 問題描述解決方案 問題描述 用git的時候可能會遇到這個問題&#xff1a; (base) zhouzikang7443-8x4090-120:~/project$ git clone https://github.com/123/12…

Windows服務器:通過nginx反向代理配置HTTPS、安裝SSL證書

先看下效果&#xff1a; 原來的是 http&#xff0c;配置好后 https 也能用了&#xff0c;并且顯示為安全鏈接。 首先需要 SSL證書 。 SSL 證書是跟域名綁定的&#xff0c;還有有效期。 windows 下雙擊可以查看相關信息。 下載的證書是分 Apache、IIS、Tomcat 和 Nginx 的。 我…

【leetcode】圓圈中最后剩下的數字

目錄 1. 問題 2. 思路 3. 代碼 4. 運行 1. 問題 本題即為典型的約瑟夫問題&#xff0c;通過遞推公式倒推出問題的解。原始問題是從n個人中每隔m個數踢出一個人&#xff0c;原始問題變成從n-1個人中每隔m個數踢出一個人…… 示例 1&#xff1a; 輸入: n 5, m 3 輸出: 3…

Unity TMP文字移動效果

前言 看見很多游戲有很特殊的波浪形文字效果&#xff0c;于是來嘗試一下控制TMP文字頂點的方式達到類似效果。 原理 掛載tmp text&#xff0c;在里面隨便放入非空格字符。 tmp text組件開放了textInfo接口&#xff0c;也就是GetComponent<TextMeshProUGUI>().textInfo…

兩天學會微服務網關Gateway-Gateway簡介

鋒哥原創的微服務網關Gateway視頻教程&#xff1a; Gateway微服務網關視頻教程&#xff08;無廢話版&#xff09;_嗶哩嗶哩_bilibiliGateway微服務網關視頻教程&#xff08;無廢話版&#xff09;共計17條視頻&#xff0c;包括&#xff1a;1_Gateway簡介、2_Gateway工作原理、3…

使用.NET開發VSTO工具快速將PPT導出為圖片

本文主要介紹如何使用.NET開發 PowerPoint VSTO 外接程序&#xff0c;并實現快速的將當前頁PPT導出為圖片的功能。可以幫助你了解如何使用 VSTO 開發 Office 外接程序&#xff0c;以及如何操作 PowerPoint 的對象模型。 1. 背景 在日常的文章寫作中&#xff0c;我經常使用 PPT…

Vue 3 中的 watchEffect 和 watch 有什么區別?

Vue 3 中的 watchEffect 和 watch 有什么區別&#xff1f; Vue 3 引入了 Composition API&#xff0c;為開發者提供了更加靈活和組織化的方式來組合和復用代碼邏輯。在響應式系統中&#xff0c;watch 和 watchEffect 是兩個重要的函數&#xff0c;用于觀察和響應 Vue 組件中狀…

JUC并發編程 深入學習Java并發編程【上】

JUC并發編程&#xff0c;深入學習Java并發編程&#xff0c;與視頻每一P對應&#xff0c;全系列6w字。 P1-5 為什么學特色預備知識 進程線程概念 進程&#xff1a; 一個程序被運行&#xff0c;從磁盤加載這個程序的代碼到內存&#xff0c;就開起了一個進程。 進程可以視為程…

JVM相關問題

JVM相關問題 一、Java繼承時父子類的初始化順序是怎樣的&#xff1f;二、JVM類加載的雙親委派模型&#xff1f;三、JDK為什么要設計雙親委派模型&#xff0c;有什么好處&#xff1f;四、可以打破JVM雙親委派模型嗎&#xff1f;如何打破JVM雙親委派模型&#xff1f;五、什么是內…

Spring Cloud Gateway-系統保護Sentinel集成

文章目錄 Sentinel介紹Spring Cloud Gateway集成Sentinelpom依賴Sentinel配置Sentinel集成Nacos作為數據源自定義降級響應 Sentinel介紹 ? 隨著微服務的流行&#xff0c;服務和服務之間的穩定性變得越來越重要。Sentinel 是面向分布式、多語言異構化服務架構的流量治理組件&a…

HTML5:七天學會基礎動畫網頁6

CSS3自定義字體 ①&#xff1a;首先需要下載所需字體 ②&#xff1a;把下載字體文件放入 font文件夾里&#xff0c;建議font文件夾與 css 和 image文件夾平級 ③&#xff1a;引入字體&#xff0c;可直接在html文件里用font-face引入字體&#xff0c;分別是字體名字和路徑 例…