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

【貪心算法】【中位貪心】LeetCode:100123.執(zhí)行操作使頻率分?jǐn)?shù)最大

這篇具有很好參考價值的文章主要介紹了【貪心算法】【中位貪心】LeetCode:100123.執(zhí)行操作使頻率分?jǐn)?shù)最大。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

涉及知識點

雙指針
C++算法:前綴和、前綴乘積、前綴異或的原理、源碼及測試用例 包括課程視頻
貪心算法

題目

給你一個下標(biāo)從 0 開始的整數(shù)數(shù)組 nums 和一個整數(shù) k 。
你可以對數(shù)組執(zhí)行 至多 k 次操作:
從數(shù)組中選擇一個下標(biāo) i ,將 nums[i] 增加 或者 減少 1 。
最終數(shù)組的頻率分?jǐn)?shù)定義為數(shù)組中眾數(shù)的 頻率 。
請你返回你可以得到的 最大 頻率分?jǐn)?shù)。
眾數(shù)指的是數(shù)組中出現(xiàn)次數(shù)最多的數(shù)。一個元素的頻率指的是數(shù)組中這個元素的出現(xiàn)次數(shù)。
示例 1:
輸入:nums = [1,2,6,4], k = 3
輸出:3
解釋:我們可以對數(shù)組執(zhí)行以下操作:

  • 選擇 i = 0 ,將 nums[0] 增加 1 。得到數(shù)組 [2,2,6,4] 。
  • 選擇 i = 3 ,將 nums[3] 減少 1 ,得到數(shù)組 [2,2,6,3] 。
  • 選擇 i = 3 ,將 nums[3] 減少 1 ,得到數(shù)組 [2,2,6,2] 。
    元素 2 是最終數(shù)組中的眾數(shù),出現(xiàn)了 3 次,所以頻率分?jǐn)?shù)為 3 。
    3 是所有可行方案里的最大頻率分?jǐn)?shù)。
    示例 2:
    輸入:nums = [1,4,4,2,4], k = 0
    輸出:3
    解釋:我們無法執(zhí)行任何操作,所以得到的頻率分?jǐn)?shù)是原數(shù)組中眾數(shù)的頻率 3 。
    參數(shù)范圍
    1 <= nums.length <= 105
    1 <= nums[i] <= 109
    0 <= k <= 1014

貪心算法(中位數(shù)貪心)

假定眾數(shù)是x,假定nums的長度為n,將nums按升序排序。

x一定是nums中的數(shù)

我們用反證發(fā)證明。

x < nums[0] 所有數(shù)先降到nums[0],再由nums[0]降到x,不如直接降到nums[0]
x > nums[n-1] 所有數(shù)先升到nums[n-1],再升到x,不如只升到nums[n-1]
x在nums[i]和nums[j]之間,nums中比x小的a個數(shù),比x大的b個數(shù)。 如果a>=b,x–,可以節(jié)省a-b個操作,直到x等于nums[i];否則x++,直到x等于nums[j]。

改變的數(shù)一定是一個子數(shù)組

假定改變的數(shù)是兩個子數(shù)組[i1,i2]和[i3,i4]。如果x在[i1,i2]之間,則將i4替換成i2+1,直到兩個子數(shù)組挨著一起合并。如果x在[i3,i4]之間,則i1替換i3-1,直到兩個子數(shù)組挨著一起合并。

x只需要考慮中位數(shù)(中位數(shù)貪心算法)

來證明貪心算法的正確性。假定x是nums[i],x前面的數(shù)a個,x后面的數(shù)b個,i變成i-1操作次數(shù)變化:b-(a-1),如果表達(dá)式大于等于0,則沒必要左移。b -a+1 >= 0,即a <=b+1。同理b <=a+1。即abs(a-b)<=1,則沒必要左移和右移。
即:
如果n為偶數(shù),中間任意一個。
如果n為奇數(shù),中間的那個。

代碼

核心代碼

class Solution {
public:
	int maxFrequencyScore(vector<int>& nums, long long k) {
		m_c = nums.size();
		sort(nums.begin(), nums.end());
		vector<long long> vPreSum = { 0 };
		for (const auto& n : nums)
		{
			vPreSum.emplace_back(n+vPreSum.back());
		}	
		int iRet = 0;
		for (int left = 0, right = 0; left < m_c; left++)
		{
			while (right <= m_c)
			{
				const long long mid = left + (right - left) / 2;
				const long long llLessNeed = (mid - left) * nums[mid] - (vPreSum[mid] - vPreSum[left]);
				const long long llEqualMoreNeed = (vPreSum[right] - vPreSum[mid]) - nums[mid] * (right - mid);
				if (llLessNeed + llEqualMoreNeed <= k)
				{
					iRet = max(iRet, right - left);
					right++;
				}
				else
				{
					break;
				}
			}			
		}
		return iRet;
	}
	int m_c;
};

測試用例

void Assert(const T& t1, const T& t2)
{
	assert(t1 == t2);
}

template<class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{
	if (v1.size() != v2.size())
	{
		assert(false);
		return;
	}
	for (int i = 0; i < v1.size(); i++)
	{
		Assert(v1[i], v2[i]);
	}
}

int main()
{
	Solution slu;
	vector<int> nums;
	int k;
	{
		Solution slu;
		nums = { 1,4,4,2,4 }, k = 0;
		auto res = slu.maxFrequencyScore(nums, k);
		Assert(3, res);
	}
	{
		Solution slu;
		nums = { 16, 2, 6, 20, 2, 18, 16, 8, 15, 19, 22, 29, 24, 2, 26, 19 }, k = 40;
		auto res = slu.maxFrequencyScore(nums, k);
		Assert(11, res);
	}
	
	{
		Solution slu;
		nums = { 1, 2, 6, 4 }, k = 3;
		auto res = slu.maxFrequencyScore(nums, k);
		Assert(3, res);
	}

	
	//CConsole::Out(res);
}

錯誤解法:二分查找+雙指針

錯誤原因: 隨著left增加targge可能減少
class Solution {
public:
int maxFrequencyScore(vector& nums, long long k) {
m_c = nums.size();
sort(nums.begin(), nums.end());
vector vPreSum = { 0 };
for (const auto& n : nums)
{
vPreSum.emplace_back(n+vPreSum.back());
}
long long llLeftSum = 0;//nums[left,target)的和,nums升序
int iRet = 0;
for (int left = 0, target = 0; left < m_c; left++)
{
while ((target < m_c) && (nums[target]*(target-left)- llLeftSum <= k))
{
const int right = BF(vPreSum,nums, target, k - (nums[target] * (target - left) - llLeftSum));
iRet = max(iRet, right - left);
llLeftSum += nums[target];
target++;
}
llLeftSum -= nums[left];
}
return iRet;
}
int BF(const vector& vPreSum,const vector& nums, int index,long long canUse)
{
int left = index, right = vPreSum.size();
while (right - left > 1)
{
const int mid = left + (right- left)/2 ;
if ((vPreSum[mid] - vPreSum[index]- nums[index] * (mid - index)) <= canUse)
{
left = mid;
}
else
{
right = mid;
}
}
return left;
}
int m_c;
};

【貪心算法】【中位貪心】LeetCode:100123.執(zhí)行操作使頻率分?jǐn)?shù)最大,# 算法題,leetcode,算法,貪心算法,c++,前綴和,中位貪心,頻率

擴展閱讀

視頻課程

有效學(xué)習(xí):明確的目標(biāo) 及時的反饋 拉伸區(qū)(難度合適),可以先學(xué)簡單的課程,請移步CSDN學(xué)院,聽白銀講師(也就是鄙人)的講解。
https://edu.csdn.net/course/detail/38771

如何你想快

速形成戰(zhàn)斗了,為老板分憂,請學(xué)習(xí)C#入職培訓(xùn)、C++入職培訓(xùn)等課程
https://edu.csdn.net/lecturer/6176

相關(guān)下載

想高屋建瓴的學(xué)習(xí)算法,請下載《喜缺全書算法冊》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想對大家說的話
聞缺陷則喜是一個美好的愿望,早發(fā)現(xiàn)問題,早修改問題,給老板節(jié)約錢。
子墨子言之:事無終始,無務(wù)多業(yè)。也就是我們常說的專業(yè)的人做專業(yè)的事。
如果程序是一條龍,那算法就是他的是睛

測試環(huán)境

操作系統(tǒng):win7 開發(fā)環(huán)境: VS2019 C++17
或者 操作系統(tǒng):win10 開發(fā)環(huán)境: VS2022 C++17
如無特殊說明,本算法用**C++**實現(xiàn)。

【貪心算法】【中位貪心】LeetCode:100123.執(zhí)行操作使頻率分?jǐn)?shù)最大,# 算法題,leetcode,算法,貪心算法,c++,前綴和,中位貪心,頻率文章來源地址http://www.zghlxwxcb.cn/news/detail-763707.html

到了這里,關(guān)于【貪心算法】【中位貪心】LeetCode:100123.執(zhí)行操作使頻率分?jǐn)?shù)最大的文章就介紹完了。如果您還想了解更多內(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ìn)行投訴反饋,一經(jīng)查實,立即刪除!

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

相關(guān)文章

  • 2530. 執(zhí)行 K 次操作后的最大分?jǐn)?shù)

    2530. 執(zhí)行 K 次操作后的最大分?jǐn)?shù)

    2530. 執(zhí)行 K 次操作后的最大分?jǐn)?shù) 難度: 中等 來源: 每日一題 2023.10.18 給你一個下標(biāo)從 0 開始的整數(shù)數(shù)組 nums 和一個整數(shù) k 。你的 起始分?jǐn)?shù) 為 0 。 在一步 操作 中: 選出一個滿足 0 = i nums.length 的下標(biāo) i , 將你的 分?jǐn)?shù) 增加 nums[i] ,并且 將 nums[i] 替換為 ceil(nums[i] / 3) 。 返回在

    2024年02月07日
    瀏覽(87)
  • C++深度優(yōu)先搜索的應(yīng)用:在樹上執(zhí)行操作以后得到的最大分?jǐn)?shù)

    C++深度優(yōu)先搜索的應(yīng)用:在樹上執(zhí)行操作以后得到的最大分?jǐn)?shù)

    深度優(yōu)先搜索(DFS) 有一棵 n 個節(jié)點的無向樹,節(jié)點編號為 0 到 n - 1 ,根節(jié)點編號為 0 。給你一個長度為 n - 1 的二維整數(shù)數(shù)組 edges 表示這棵樹,其中 edges[i] = [ai, bi] 表示樹中節(jié)點 ai 和 bi 有一條邊。 同時給你一個長度為 n 下標(biāo)從 0 開始的整數(shù)數(shù)組 values ,其中 values[i] 表示第

    2024年02月05日
    瀏覽(18)
  • 算法沉淀——貪心算法五(leetcode真題剖析)

    算法沉淀——貪心算法五(leetcode真題剖析)

    題目鏈接:https://leetcode.cn/problems/jump-game-ii/ 給定一個長度為 n 的 0 索引 整數(shù)數(shù)組 nums 。初始位置為 nums[0] 。 每個元素 nums[i] 表示從索引 i 向前跳轉(zhuǎn)的最大長度。換句話說,如果你在 nums[i] 處,你可以跳轉(zhuǎn)到任意 nums[i + j] 處: 0 = j = nums[i] i + j n 返回到達(dá) nums[n - 1] 的最小跳躍次

    2024年04月11日
    瀏覽(23)
  • 算法沉淀——貪心算法六(leetcode真題剖析)

    算法沉淀——貪心算法六(leetcode真題剖析)

    題目鏈接:https://leetcode.cn/problems/broken-calculator/ 在顯示著數(shù)字 startValue 的壞計算器上,我們可以執(zhí)行以下兩種操作: **雙倍(Double):**將顯示屏上的數(shù)字乘 2; **遞減(Decrement):**將顯示屏上的數(shù)字減 1 。 給定兩個整數(shù) startValue 和 target 。返回顯示數(shù)字 target 所需的最小操

    2024年04月11日
    瀏覽(45)
  • 算法沉淀——貪心算法三(leetcode真題剖析)

    算法沉淀——貪心算法三(leetcode真題剖析)

    題目鏈接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/ 給你一個整數(shù)數(shù)組 prices ,其中 prices[i] 表示某支股票第 i 天的價格。 在每一天,你可以決定是否購買和/或出售股票。你在任何時候 最多 只能持有 一股 股票。你也可以先購買,然后在 同一天 出售。 返回 你能獲得

    2024年03月24日
    瀏覽(20)
  • 算法沉淀——貪心算法七(leetcode真題剖析)

    算法沉淀——貪心算法七(leetcode真題剖析)

    題目鏈接:https://leetcode.cn/problems/integer-replacement/ 給定一個正整數(shù) n ,你可以做如下操作: 如果 n 是偶數(shù),則用 n / 2 替換 n 。 如果 n 是奇數(shù),則可以用 n + 1 或 n - 1 替換 n 。 返回 n 變?yōu)?1 所需的 最小替換次數(shù) 。 示例 1: 示例 2: 示例 3: 提示: 1 = n = 2^31 - 1 思路 這里我們

    2024年03月23日
    瀏覽(24)
  • 算法沉淀——貪心算法一(leetcode真題剖析)

    算法沉淀——貪心算法一(leetcode真題剖析)

    貪心算法(Greedy Algorithm)是一種基于貪心策略的優(yōu)化算法,它通常用于求解最優(yōu)化問題,每一步都選擇當(dāng)前狀態(tài)下的最優(yōu)解,以期望通過局部最優(yōu)的選擇最終達(dá)到全局最優(yōu)。貪心算法的思想是在每一步都做出在當(dāng)前狀態(tài)下局部最優(yōu)的選擇,而不考慮未來可能造成的影響。 在

    2024年03月08日
    瀏覽(17)
  • 算法沉淀——貪心算法二(leetcode真題剖析)

    算法沉淀——貪心算法二(leetcode真題剖析)

    題目鏈接:https://leetcode.cn/problems/longest-increasing-subsequence/ 給你一個整數(shù)數(shù)組 nums ,找到其中最長嚴(yán)格遞增子序列的長度。 子序列 是由數(shù)組派生而來的序列,刪除(或不刪除)數(shù)組中的元素而不改變其余元素的順序。例如, [3,6,2,7] 是數(shù)組 [0,3,1,6,2,2,7] 的子序列。 示例 1: 示

    2024年03月19日
    瀏覽(68)
  • 【貪心算法】leetcode刷題

    【貪心算法】leetcode刷題

    貪心算法無固定套路。 核心思想:先找局部最優(yōu),再擴展到全局最優(yōu)。 兩種思路: 1、從大到小。局部最優(yōu)就是大餅干喂給胃口大的,充分利用餅干尺寸喂飽一個,全局最優(yōu)就是喂飽盡可能多的小孩。 先遍歷的胃口,在遍歷的餅干 2、從小到大。 小餅干先喂飽小胃口 。兩個

    2024年02月14日
    瀏覽(24)
  • leetcode系列貪心算法匯總

    11 盛水最多的容器 題目:給一個一維數(shù)組,大概的意思就是下標(biāo)代表水槽的寬度,數(shù)組的值代表這個位置水槽的高度,求盛水最多的容量。 解析:肯定得有個臨時變量來存最大值,且不斷進(jìn)行比較來更新最大值,然后分別從兩邊開始使用雙指針進(jìn)行遍歷,tmp := (right - left)

    2024年02月07日
    瀏覽(15)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包