国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

leetcode 122雙周賽 解題思路+代碼

這篇具有很好參考價值的文章主要介紹了leetcode 122雙周賽 解題思路+代碼。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

本人水平有限,只做出3道,最后1道放棄。

一.將數(shù)組分成最小總代價的子數(shù)組 I

給你一個長度為 n 的整數(shù)數(shù)組 nums 。

一個數(shù)組的 代價 是它的 第一個 元素。比方說,[1,2,3] 的代價是 1 ,[3,4,1] 的代價是 3 。

你需要將 nums 分成 3 個 連續(xù)且沒有交集 的子數(shù)組。

請你返回這些子數(shù)組的 最小 代價 總和 。

示例 1:

輸入:nums = [1,2,3,12]
輸出:6
解釋:最佳分割成 3 個子數(shù)組的方案是:[1] ,[2] 和 [3,12] ,總代價為 1 + 2 + 3 = 6 。
其他得到 3 個子數(shù)組的方案是:

  • [1] ,[2,3] 和 [12] ,總代價是 1 + 2 + 12 = 15 。
  • [1,2] ,[3] 和 [12] ,總代價是 1 + 3 + 12 = 16 。
    示例 2:

輸入:nums = [5,4,3]
輸出:12
解釋:最佳分割成 3 個子數(shù)組的方案是:[5] ,[4] 和 [3] ,總代價為 5 + 4 + 3 = 12 。
12 是所有分割方案里的最小總代價。
示例 3:

輸入:nums = [10,3,1,1]
輸出:12
解釋:最佳分割成 3 個子數(shù)組的方案是:[10,3] ,[1] 和 [1] ,總代價為 10 + 1 + 1 = 12 。
12 是所有分割方案里的最小總代價。

解題思路

題目要求將原數(shù)組分割為三個子數(shù)組,每個子數(shù)組的第一個元素為該子數(shù)組的代價,求分割方案中三個子數(shù)組的最小總代價

設(shè)定兩個指針i和j作為邊界分割,三個子數(shù)組的區(qū)間范圍為[0,i-1],[i,j-1],[j,m]。
花銷的表達式為nums[0]+nums[i]+nums[j]

代碼
class Solution {
    public int minimumCost(int[] nums) {
        int n = nums.length;
        int minCost = Integer.MAX_VALUE;
        for (int i = 1; i < n-1; i++) {
            for (int j = i+1; j < n; j++) {
                minCost = Math.min(minCost, nums[0] + nums[i] + nums[j]);
            }
        }
        return minCost;
    }
}

二、判斷一個數(shù)組是否可以變?yōu)橛行?/h3>

題目

給你一個下標(biāo)從 0 開始且全是 正 整數(shù)的數(shù)組 nums 。

一次 操作 中,如果兩個 相鄰 元素在二進制下數(shù)位為 1 的數(shù)目 相同 ,那么你可以將這兩個元素交換。你可以執(zhí)行這個操作 任意次 (也可以 0 次)。

如果你可以使數(shù)組變有序,請你返回 true ,否則返回 false 。

示例 1:

輸入:nums = [8,4,2,30,15]
輸出:true
解釋:我們先觀察每個元素的二進制表示。 2 ,4 和 8 分別都只有一個數(shù)位為 1 ,分別為 “10” ,“100” 和 “1000” 。15 和 30 分別有 4 個數(shù)位為 1 :“1111” 和 “11110” 。
我們可以通過 4 個操作使數(shù)組有序:

  • 交換 nums[0] 和 nums[1] 。8 和 4 分別只有 1 個數(shù)位為 1 。數(shù)組變?yōu)?[4,8,2,30,15] 。
  • 交換 nums[1] 和 nums[2] 。8 和 2 分別只有 1 個數(shù)位為 1 。數(shù)組變?yōu)?[4,2,8,30,15] 。
  • 交換 nums[0] 和 nums[1] 。4 和 2 分別只有 1 個數(shù)位為 1 。數(shù)組變?yōu)?[2,4,8,30,15] 。
  • 交換 nums[3] 和 nums[4] 。30 和 15 分別有 4 個數(shù)位為 1 ,數(shù)組變?yōu)?[2,4,8,15,30] 。
    數(shù)組變成有序的,所以我們返回 true 。
    注意我們還可以通過其他的操作序列使數(shù)組變得有序。
    示例 2:

輸入:nums = [1,2,3,4,5]
輸出:true
解釋:數(shù)組已經(jīng)是有序的,所以我們返回 true 。
示例 3:

輸入:nums = [3,16,8,4,2]
輸出:false
解釋:無法通過操作使數(shù)組變?yōu)橛行颉?/p>

解題思路

題目要求我們只能對在二進制下數(shù)位為1的數(shù)量相同的數(shù)字之間進行交換,判斷數(shù)組是否可以變得有序。
初始思路考慮過,構(gòu)建一個數(shù)組表示原始數(shù)組元素二進制形式數(shù)位為1的數(shù)量,構(gòu)建另一個數(shù)組表示排序后的原始數(shù)組二進制形式數(shù)位為1的數(shù)量,并通過Arrays.equals()進行比較。但是,要考慮到特殊情況數(shù)位小的數(shù)字可能比數(shù)位大的數(shù)字要大,例如:4的數(shù)位為1,3的數(shù)位卻為2.

最終考慮到題目要求允許交換二進制中1的數(shù)目相同的相鄰元素,符合動態(tài)連通性的定義,考慮通過并查集解決問題。先克隆一個原始數(shù)組,并對其進行排序,以獲取每個元素應(yīng)該存放的位置,并將相鄰元素間二進制數(shù)位為1數(shù)量相同的進行合并,合并后,對每個位置上的現(xiàn)有元素和應(yīng)存放元素進行查找,判斷這兩個元素是否具有相同的關(guān)鍵元素,從而判斷原始元素是否能夠通過元素交換交換到正確的位置上。

代碼
class Solution {
    public boolean canSortArray(int[] nums) {
        int n = nums.length;
        // nums1 是 nums 的一個副本,用于排序
        int[] nums1 = nums.clone();
        Arrays.sort(nums1);

        // 初始化并查集的數(shù)組
        int[] parent = new int[n];
        for (int i = 0; i < n; i++) {
            parent[i] = i;
        }

        // d 是一個映射,用于記錄原數(shù)組中每個數(shù)字的位置
        Map<Integer, Integer> d = new HashMap<>();
        for (int i = 0; i < n; i++) {
            d.put(nums[i], i);
        }

        // 遍歷數(shù)組,將二進制1的數(shù)量相同的相鄰元素合并
        for (int i = 1; i < n; i++) {
            if (Integer.bitCount(nums[i]) == Integer.bitCount(nums[i - 1])) {
                union(parent, i, i - 1);
            }
        }

        // 檢查排序后的數(shù)組是否可以通過交換特定的相鄰元素變?yōu)樵瓟?shù)組的順序
        for (int i = 0; i < n; i++) {
            if (nums[i] != nums1[i] && find(parent, i) != find(parent, d.get(nums1[i]))) {
                return false;
            }
        }
        return true;
    }

    // find 函數(shù)用于查找元素所在集合的代表元素
    private int find(int[] parent, int x) {
        if (parent[x] != x) {
            parent[x] = find(parent, parent[x]);
        }
        return parent[x];
    }

    // union 函數(shù)用于合并兩個元素所在的集合
    private void union(int[] parent, int x, int y) {
        int fx = find(parent, x);
        int fy = find(parent, y);
        if (fx != fy) {
            parent[fx] = fy;
        }
    }
}
并查集

適用場景:涉及多個元素分組和組間關(guān)系的場景。
動態(tài)連接問題

  1. 合并(Union):
    將兩個符合相同規(guī)則的獨立集合合并為一個集合。

  2. 查詢(Find):
    找到這個集合的"根",便于我們快速檢查兩個元素是否屬于一個集合。

代碼模板:

...
// 初始化并查集數(shù)組
int[] parent = new int[n];
for(int i = 0;i < n;i++){
	parent[i] = i;// parent[i]表示元素`i`在并查集中的代表元素的位置
}

// find 函數(shù)用于查找元素所在集合的代表元素
private int find(int[] parent,int x){
	if(parent[x] != x){
		parent[x] = find(parent,parent[x]);
	}
	return parent[x];
}

// union 函數(shù)用于合并兩個元素所在的集合
private void union(int[] parent,int x,int y){
	int fx = find(parent,x);
	int fy = find(parent,y);
	if(fx!=fy){
		parent[fx] = fy;
	}
}

三、通過操作使數(shù)組長度最小

題目

給你一個下標(biāo)從 0 開始的整數(shù)數(shù)組 nums ,它只包含 正 整數(shù)。

你的任務(wù)是通過進行以下操作 任意次 (可以是 0 次) 最小化 nums 的長度:

在 nums 中選擇 兩個不同 的下標(biāo) i 和 j ,滿足 nums[i] > 0 且 nums[j] > 0 。
將結(jié)果 nums[i] % nums[j] 插入 nums 的結(jié)尾。
將 nums 中下標(biāo)為 i 和 j 的元素刪除。
請你返回一個整數(shù),它表示進行任意次操作以后 nums 的 最小長度 。

示例 1:

輸入:nums = [1,4,3,1]
輸出:1
解釋:使數(shù)組長度最小的一種方法是:
操作 1 :選擇下標(biāo) 2 和 1 ,插入 nums[2] % nums[1] 到數(shù)組末尾,得到 [1,4,3,1,3] ,然后刪除下標(biāo)為 2 和 1 的元素。
nums 變?yōu)?[1,1,3] 。
操作 2 :選擇下標(biāo) 1 和 2 ,插入 nums[1] % nums[2] 到數(shù)組末尾,得到 [1,1,3,1] ,然后刪除下標(biāo)為 1 和 2 的元素。
nums 變?yōu)?[1,1] 。
操作 3 :選擇下標(biāo) 1 和 0 ,插入 nums[1] % nums[0] 到數(shù)組末尾,得到 [1,1,0] ,然后刪除下標(biāo)為 1 和 0 的元素。
nums 變?yōu)?[0] 。
nums 的長度無法進一步減小,所以答案為 1 。
1 是可以得到的最小長度。
示例 2:

輸入:nums = [5,5,5,10,5]
輸出:2
解釋:使數(shù)組長度最小的一種方法是:
操作 1 :選擇下標(biāo) 0 和 3 ,插入 nums[0] % nums[3] 到數(shù)組末尾,得到 [5,5,5,10,5,5] ,然后刪除下標(biāo)為 0 和 3 的元素。
nums 變?yōu)?[5,5,5,5] 。
操作 2 :選擇下標(biāo) 2 和 3 ,插入 nums[2] % nums[3] 到數(shù)組末尾,得到 [5,5,5,5,0] ,然后刪除下標(biāo)為 2 和 3 的元素。
nums 變?yōu)?[5,5,0] 。
操作 3 :選擇下標(biāo) 0 和 1 ,插入 nums[0] % nums[1] 到數(shù)組末尾,得到 [5,5,0,0] ,然后刪除下標(biāo)為 0 和 1 的元素。
nums 變?yōu)?[0,0] 。
nums 的長度無法進一步減小,所以答案為 2 。
2 是可以得到的最小長度。
示例 3:

輸入:nums = [2,3,4]
輸出:1
解釋:使數(shù)組長度最小的一種方法是:
操作 1 :選擇下標(biāo) 1 和 2 ,插入 nums[1] % nums[2] 到數(shù)組末尾,得到 [2,3,4,3] ,然后刪除下標(biāo)為 1 和 2 的元素。
nums 變?yōu)?[2,3] 。
操作 2 :選擇下標(biāo) 1 和 0 ,插入 nums[1] % nums[0] 到數(shù)組末尾,得到 [2,3,1] ,然后刪除下標(biāo)為 1 和 0 的元素。
nums 變?yōu)?[1] 。
nums 的長度無法進一步減小,所以答案為 1 。
1 是可以得到的最小長度。

提示:

1 <= nums.length <= 105
1 <= nums[i] <= 109

解題思路

題目要求我們對數(shù)組選取下標(biāo)i,j(nums[i]>0 nums[j]>0),插入nums[i]%nums[j],并且刪除nums[i],nums[j]。根據(jù)這個規(guī)則,求出數(shù)組的最小長度。
首先對nums[i]%nums[j]進行分類討論
① nums[i]<nums[j]
nums[i]%nums[j]=nums[i],最終保留nums[i],剔除nums[j],理解為小數(shù)踢大數(shù)
② nums[i]>=nums[j]
A.非整除
顯然nums[i]%nums[j]<nums[j]<=nums[i],得到一個更小數(shù),這個更小數(shù)可以提走所有大數(shù),結(jié)果為1(這也是最優(yōu)情況)
B.整除
如果大數(shù)整除小數(shù),生成0,會占位置,因為nums[i]=0不能參與規(guī)則,因此考慮小數(shù)整除大數(shù)。并且分類討論奇數(shù)和偶數(shù)個最小值的情況,總結(jié)出規(guī)律(m+1)//2

對規(guī)律進行提煉優(yōu)化,即考慮遍歷所有數(shù)并判斷是否能夠整除最小數(shù),如果不能,結(jié)果為1;如果能,再獲取最小數(shù)的數(shù)量,并且利用(m+1)//2計算。文章來源地址http://www.zghlxwxcb.cn/news/detail-829445.html

代碼
class Solution {
    public int minimumArrayLength(int[] nums) {
        int m = findMin(nums);
        for (int num : nums) {
            if (num % m != 0) { // 可以產(chǎn)生新的最小值
                return 1;
            }
        }
        int length = count(nums, m);
        return (length + 1) / 2;  // 向上取整
    }

    // 尋找數(shù)組中的最小值
    private int findMin(int[] nums) {
        int minVal = nums[0];
        for (int num : nums) {
            if (num < minVal) {
                minVal = num;
            }
        }
        return minVal;
    }

    // 計算最小值在數(shù)組中出現(xiàn)的次數(shù)
    private int count(int[] nums, int m) {
        int count = 0;
        for (int num : nums) {
            if (num == m) {
                count++;
            }
        }
        return count;
    }
}

到了這里,關(guān)于leetcode 122雙周賽 解題思路+代碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 第 107 場LeetCode雙周賽

    第 107 場LeetCode雙周賽

    A 最大字符串配對數(shù)目 顯然各字符串對 間匹配的先后順序不影響最大匹配數(shù)目, 可以從后往前遍歷數(shù)組, 判斷前面是否有和當(dāng)前末尾構(gòu)成匹配的. B 構(gòu)造最長的新字符串 記憶化搜索: 定義狀態(tài) p a a , b b , a b , l a s t p_{aa,bb,ab,last} p aa , bb , ab , l a s t ? 為剩余三種字符串分別為aa、

    2024年02月11日
    瀏覽(22)
  • leetcode第124場雙周賽

    給你一個整數(shù)數(shù)組? nums ?,如果? nums ? 至少 ?包含? 2 ?個元素,你可以執(zhí)行以下操作: 選擇? nums ?中的前兩個元素并將它們刪除。 一次操作的? 分數(shù) ?是被刪除元素的和。 在確保 ?所有操作分數(shù)相同 ?的前提下,請你求出? 最多 ?能進行多少次操作。 請你返回按照上述

    2024年02月19日
    瀏覽(17)
  • LeetCode---121雙周賽---數(shù)位dp

    LeetCode---121雙周賽---數(shù)位dp

    2996. 大于等于順序前綴和的最小缺失整數(shù) 2997. 使數(shù)組異或和等于 K 的最少操作次數(shù) 2998. 使 X 和 Y 相等的最少操作次數(shù) 2999. 統(tǒng)計強大整數(shù)的數(shù)目 簡單的模擬題,只要按照題目的要求去寫代碼即可,代碼如下 這題考異或的性質(zhì)---相同為0,相異為1,我們只要關(guān)心nums的異或和與

    2024年01月22日
    瀏覽(20)
  • [LeetCode108雙周賽&LeetCode353周賽] 學(xué)習(xí)用記憶化搜索解決 DP 問題

    參考靈神直播和代碼 @cache 裝飾器的作用:將傳入不同參數(shù)得到的函數(shù)值存儲到緩存,避免下次傳遞相同參數(shù)重復(fù)計算結(jié)果,可用于解決遞歸函數(shù)重復(fù)計算問題,比如遞歸求斐波那契問題。 https://leetcode.cn/problems/maximum-number-of-jumps-to-reach-the-last-index/ 記憶化搜索 dfs(i) 表示以

    2024年02月13日
    瀏覽(24)
  • LeetCode 雙周賽 106(2023/06/10)兩道思維題

    本文已收錄到 AndroidFamily,技術(shù)和職場問題,請關(guān)注公眾號 [彭旭銳] 加入知識星球提問。 往期回顧:LeetCode 單周賽第 348 場 · 數(shù)位 DP 模版學(xué)會了嗎? T1. 判斷一個數(shù)是否迷人(Easy) 標(biāo)簽:計數(shù) T2. 找到最長的半重復(fù)子字符串(Medium) 標(biāo)簽:同向雙指針 T3. 移動機器人(Medi

    2024年02月08日
    瀏覽(23)
  • LeetCode 雙周賽 101,DP/中心位貪心/裴蜀定理/Dijkstra/最小環(huán)

    本文已收錄到 AndroidFamily,技術(shù)和職場問題,請關(guān)注公眾號 [彭旭銳] 提問。 大家好,我是小彭。 這周比較忙,上周末的雙周賽題解現(xiàn)在才更新,雖遲但到哈。上周末這場是 LeetCode 第 101 場雙周賽,整體有點難度,第 3 題似乎比第 4 題還難一些。 2605.?從兩個數(shù)字數(shù)組里生成最

    2023年04月09日
    瀏覽(18)
  • LeetCode 雙周賽 104(2023/05/13)流水的動態(tài)規(guī)劃,鐵打的結(jié)構(gòu)化思考

    本文已收錄到 AndroidFamily,技術(shù)和職場問題,請關(guān)注公眾號 [彭旭銳] 提問。 往期回顧:LeetCode 單周賽第 344 場 · 手寫遞歸函數(shù)的通用套路 T1. 老人的數(shù)目(Easy) 標(biāo)簽:模擬、計數(shù) T2. 矩陣中的和(Medium) 標(biāo)簽:模擬、排序 T3. 最大或值(Medium) 標(biāo)簽:動態(tài)規(guī)劃、前后綴分解

    2024年02月04日
    瀏覽(52)
  • Leetcode 75——1768.交替合并字符串 解題思路與具體代碼【C++】

    Leetcode 75——1768.交替合并字符串 解題思路與具體代碼【C++】

    1768. 交替合并字符串 - 力扣(LeetCode) 給你兩個字符串? word1 ?和? word2 ?。請你從? word1 ?開始,通過交替添加字母來合并字符串。如果一個字符串比另一個字符串長,就將多出來的字母追加到合并后字符串的末尾。 返回? 合并后的字符串 ?。 1 = word1.length, word2.length = 100

    2024年02月07日
    瀏覽(19)
  • 【每日算法 && 數(shù)據(jù)結(jié)構(gòu)(C++)】—— 03 | 合并兩個有序數(shù)組(解題思路、流程圖、代碼片段)

    【每日算法 && 數(shù)據(jù)結(jié)構(gòu)(C++)】—— 03 | 合并兩個有序數(shù)組(解題思路、流程圖、代碼片段)

    An inch of time is an inch of gold, but you can’t buy that inch of time with an inch of gold. An inch of time is an inch of gold, but you can\\\'t buy that inch of time with an inch of gold 給你兩個有序數(shù)組,請將兩個數(shù)組進行合并,并且合并后的數(shù)組也必須有序 這個題目要求將兩個有序數(shù)組合并成一個有序數(shù)組。在數(shù)

    2024年02月11日
    瀏覽(21)
  • 【每日算法 && 數(shù)據(jù)結(jié)構(gòu)(C++)】—— 02 | 數(shù)組的并交集(解題思路、流程圖、代碼片段)

    【每日算法 && 數(shù)據(jù)結(jié)構(gòu)(C++)】—— 02 | 數(shù)組的并交集(解題思路、流程圖、代碼片段)

    When you feel like giving up, remember why you started. 當(dāng)你想放棄時,請記住為什么你開始 給你兩個數(shù)組,請分別求出兩個數(shù)組的交集和并集 在數(shù)學(xué)中,我們可以通過交集和并集來描述兩個集合之間的關(guān)系。 交集(Intersection) :指的是兩個集合中共有的元素組成的集合??梢杂梅?/p>

    2024年02月11日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包