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

【動(dòng)態(tài)規(guī)劃】【數(shù)學(xué)】【C++算法】805 數(shù)組的均值分割

這篇具有很好參考價(jià)值的文章主要介紹了【動(dòng)態(tài)規(guī)劃】【數(shù)學(xué)】【C++算法】805 數(shù)組的均值分割。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

作者推薦

視頻算法專題

本文涉及知識(shí)點(diǎn)

動(dòng)態(tài)規(guī)劃匯總
數(shù)學(xué)

805 數(shù)組的均值分割

給定你一個(gè)整數(shù)數(shù)組 nums
我們要將 nums 數(shù)組中的每個(gè)元素移動(dòng)到 A 數(shù)組 或者 B 數(shù)組中,使得 A 數(shù)組和 B 數(shù)組不為空,并且 average(A) == average(B) 。
如果可以完成則返回true , 否則返回 false 。
注意:對(duì)于數(shù)組 arr , average(arr) 是 arr 的所有元素的和除以 arr 長(zhǎng)度。
示例 1:
輸入: nums = [1,2,3,4,5,6,7,8]
輸出: true
解釋: 我們可以將數(shù)組分割為 [1,4,5,8] 和 [2,3,6,7], 他們的平均值都是4.5。
示例 2:
輸入: nums = [3,1]
輸出: false
參數(shù)范圍:
1 <= nums.length <= 30
0 <= nums[i] <= 104

動(dòng)態(tài)規(guī)劃

令n=nums.length half=n/2。不失一般性,令A(yù)的長(zhǎng)度小于等于B,則lena的長(zhǎng)度取值范圍[1,half],lenb=n-lena。
數(shù)組A的和為:Sum i = 0 : n ? 1 \Large_{i=0}^{:n-1} i=0:n?1?nums[i]*lena/n ,數(shù)組A的和必須是整數(shù)。nums[i]的和最大為104*30 ,lean最大為15,可以直接相乘,看對(duì)n的余數(shù)是否為0。如果超出整數(shù)范圍,可以先對(duì)lena和n約分。

預(yù)處理CountToTotal

將nums分成兩部分。vLeft[i]記錄所有從nums[0,half)選擇i個(gè)數(shù) 可能的和。 vRight[i]記錄所有從nums[half,n)中選擇i個(gè)數(shù)的和。下面以vLeft為例,vRightei類似。三層循環(huán)
第一層循環(huán):枚舉[0,half)。時(shí)間復(fù)雜度O(n)
第二層循環(huán):從大到小枚舉vLeft[j]。 時(shí)間復(fù)雜度(n)。
第三層循環(huán):枚舉vLeft[j-1]。 時(shí)間復(fù)雜度O(2^n)
動(dòng)態(tài)規(guī)劃的轉(zhuǎn)移方程:本輪的vLeft[j]一定是上一輪的vLeft[j-1]+nums[i]??倳r(shí)間復(fù)雜度O(1515215) 約106

處理

第一層循環(huán):用變量i枚舉lena。
第二層循環(huán):枚舉A從左邊選擇了j個(gè)元素,j的取值范圍[0,i]。
第三層循環(huán):通過iLeft枚舉vLeft[j],看vRight[i-j]是否存在totalA - iLeft。
時(shí)間復(fù)雜度: O(nn2n)

代碼

核心代碼

int GCD(int n1, int n2)
{
	int t1 = min(n1, n2);
	int t2 = max(n1, n2);
	if (0 == t1)
	{
		return t2;
	}
	return GCD(t2 % t1, t1);
}

class Solution {
public:
	bool splitArraySameAverage(vector<int>& nums) {
		const int n = nums.size();
		const int half = n / 2;
		vector<unordered_set<int>> vLeft(1), vRight(1);		
		CountToTotal( vLeft, nums.data(),0, half);
		CountToTotal(vRight, nums.data()+half, 0, n-half);

		const int total = std::accumulate(nums.begin(), nums.end(),0);
		for (int i = 1; i <= half; i++)
		{
			const int iGCD = GCD(i, n);
			if (0 != total % (n / iGCD))
			{
				continue;//A的和必定為整數(shù)
			}
			const int totalA = total * i / n;
			for (int j = 0; j <= i; j++)
			{// A數(shù)組總共選擇i個(gè),其中從左邊選擇j個(gè)
				for (const auto& iLeft : vLeft[j])
				{
					if (vRight[i - j].count(totalA - iLeft))
					{
						return true;
					}
				}
			}
		}
		return false;
	}
	void CountToTotal(std::vector<std::unordered_set<int>>& v, const int* p,int left,int r)
	{
		v[0].emplace(0);
		for (int i = left; i < r ; i++)
		{
			v.emplace_back();
			for (int j = v.size() - 1; j >= 1; j--)
			{
				for (const auto& pre : v[j - 1])
				{
					v[j].emplace(pre + p[i]);
				}
			}
		}
	}
};

測(cè)試用例

template<class T>
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()
{
	vector<int> nums;
	{
		Solution sln;
		nums = { 1,2,3,4,5,6,7,8 };
		auto res = sln.splitArraySameAverage(nums);
		Assert(true, res);
	}
	{
		Solution sln;
		nums = { 3,1};
		auto res = sln.splitArraySameAverage(nums);
		Assert(false, res);
	}
	{
		Solution sln;
		nums = { 18,10,5,3 };
		auto res = sln.splitArraySameAverage(nums);
		Assert(false, res);
	}
	
}

2023年1月

class Solution {
public:
bool splitArraySameAverage(vector& nums) {
if (1 == nums.size())
{
return false;
}
const int iLeftMaxLen = nums.size() / 2;
const int iRightMaxLen = nums.size() - iLeftMaxLen;
vector<std::unordered_set> vLeftLenSums(iLeftMaxLen+1),vRightLenSums(iRightMaxLen+1);
vLeftLenSums[0].insert(0);
for (int i = 0; i < iLeftMaxLen; i++)
{
for (int j = i ; j >=0 ; j-- )
{
for (auto& it : vLeftLenSums[j])
{
vLeftLenSums[j + 1].insert(it +nums[i]);
}
}
vLeftLenSums[1].insert(nums[i]);
}
vRightLenSums[0].insert(0);
for (int i = iLeftMaxLen; i < nums.size(); i++)
{
for (int j = i - iLeftMaxLen; j >= 0; j–)
{
for (auto& it : vRightLenSums[j])
{
vRightLenSums[j + 1].insert(it + nums[i]);
}
}
}
int iTotalSum = std::accumulate(nums.begin(), nums.end(), 0);
for (int iALen = 1; iALen + 1 <= nums.size(); iALen++)
{
double dSum = iTotalSum 1.0 / nums.size() iALen;
int iSum = dSum;
bool bInt = ((dSum - iSum) < 0.0001) || ((dSum - iSum) > 0.9999);
if (!bInt)
{
continue;
}
for (int iLeftLen = max(0,iALen-iRightMaxLen); (iLeftLen <= min(iALen, iLeftMaxLen)); iLeftLen++)
{
for (const auto& it : vLeftLenSums[iLeftLen])
{
if (vRightLenSums[iALen - iLeftLen].count(iSum - it))
{
return true;
}
}
}
}
return false;
}
};

【動(dòng)態(tài)規(guī)劃】【數(shù)學(xué)】【C++算法】805 數(shù)組的均值分割,# 算法題,算法,動(dòng)態(tài)規(guī)劃,c++,LeetCode,數(shù)學(xué),數(shù)組,分割

擴(kuò)展閱讀

視頻課程

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

如何你想快

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

相關(guān)下載

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

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

測(cè)試環(huán)境

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

【動(dòng)態(tài)規(guī)劃】【數(shù)學(xué)】【C++算法】805 數(shù)組的均值分割,# 算法題,算法,動(dòng)態(tài)規(guī)劃,c++,LeetCode,數(shù)學(xué),數(shù)組,分割文章來源地址http://www.zghlxwxcb.cn/news/detail-829444.html

到了這里,關(guān)于【動(dòng)態(tài)規(guī)劃】【數(shù)學(xué)】【C++算法】805 數(shù)組的均值分割的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • leetcode410. 分割數(shù)組的最大值 動(dòng)態(tài)規(guī)劃

    hard:https://leetcode.cn/problems/split-array-largest-sum/ 給定一個(gè)非負(fù)整數(shù)數(shù)組 nums 和一個(gè)整數(shù) m , 你需要將這個(gè)數(shù)組分成 m 個(gè)非空的連續(xù)子數(shù)組 。 設(shè)計(jì)一個(gè)算法使得這 m 個(gè)子數(shù)組各自和 的 最大值最小 。 令 dp[i][j]表示將數(shù)組的 前 i 個(gè)數(shù)分割為 j 組 所能得到的最大連續(xù)子數(shù)組和的最

    2024年02月13日
    瀏覽(22)
  • 【LeetCode: 410. 分割數(shù)組的最大值 | 暴力遞歸=>記憶化搜索=>動(dòng)態(tài)規(guī)劃 】

    【LeetCode: 410. 分割數(shù)組的最大值 | 暴力遞歸=>記憶化搜索=>動(dòng)態(tài)規(guī)劃 】

    ?? 算法題 ?? ?? 算法刷題專欄 | 面試必備算法 | 面試高頻算法 ?? ?? 越難的東西,越要努力堅(jiān)持,因?yàn)樗哂泻芨叩膬r(jià)值,算法就是這樣? ?? 作者簡(jiǎn)介:碩風(fēng)和煒,CSDN-Java領(lǐng)域優(yōu)質(zhì)創(chuàng)作者??,保研|國(guó)家獎(jiǎng)學(xué)金|高中學(xué)習(xí)JAVA|大學(xué)完善JAVA開發(fā)技術(shù)棧|面試刷題|面經(jīng)八股文

    2024年02月10日
    瀏覽(55)
  • 【組合數(shù)學(xué)】【動(dòng)態(tài)規(guī)劃】【前綴和】1735生成乘積數(shù)組的方案數(shù)

    【組合數(shù)學(xué)】【動(dòng)態(tài)規(guī)劃】【前綴和】1735生成乘積數(shù)組的方案數(shù)

    【動(dòng)態(tài)規(guī)劃】【狀態(tài)壓縮】【2次選擇】【廣度搜索】1494. 并行課程 II 動(dòng)態(tài)規(guī)劃匯總 C++算法:前綴和、前綴乘積、前綴異或的原理、源碼及測(cè)試用例 包括課程視頻 組合數(shù)學(xué) 給你一個(gè)二維整數(shù)數(shù)組 queries ,其中 queries[i] = [ni, ki] 。第 i 個(gè)查詢 queries[i] 要求構(gòu)造長(zhǎng)度為 ni 、每個(gè)

    2024年02月19日
    瀏覽(28)
  • 動(dòng)態(tài)規(guī)劃(一) 變態(tài)青蛙跳臺(tái)階、最大連續(xù)子數(shù)組和、字符串分割 附源碼講解

    動(dòng)態(tài)規(guī)劃(一) 變態(tài)青蛙跳臺(tái)階、最大連續(xù)子數(shù)組和、字符串分割 附源碼講解

    實(shí)現(xiàn) import java.util.*; public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); while (scan.hasNext()){ int length = scan.nextInt(); int[] array = new int[length]; for (int i = 0; i length; i++) { array[i] = scan.nextInt(); } System.out.println(findResult(array)); } } private static int findResult(int[] array) {

    2024年04月17日
    瀏覽(26)
  • Day42|動(dòng)態(tài)規(guī)劃part04: 01背包問題,你該了解這些!、滾動(dòng)數(shù)組、416. 分割等和子集

    Day42|動(dòng)態(tài)規(guī)劃part04: 01背包問題,你該了解這些!、滾動(dòng)數(shù)組、416. 分割等和子集

    其他背包,面試幾乎不會(huì)問,都是競(jìng)賽級(jí)別的了,leetcode上連多重背包的題目都沒有,所以題庫也告訴我們,01背包和完全背包就夠用了。 而完全背包又是也是01背包稍作變化而來,即:完全背包的物品數(shù)量是無限的。 01 背包問題描述 有n件物品和一個(gè)最多能背重量為w 的背包

    2024年04月25日
    瀏覽(17)
  • c++ 子數(shù)組動(dòng)態(tài)規(guī)劃問題

    1.最大子數(shù)組和?? 力扣 給你一個(gè)整數(shù)數(shù)組 nums ,請(qǐng)你找出一個(gè)具有最大和的連續(xù)子數(shù)組(子數(shù)組最少包含一個(gè)元素),返回其最大和。 子數(shù)組 是數(shù)組中的一個(gè)連續(xù)部分。 示例 1: 示例 2: 示例 3: 2.環(huán)形子數(shù)組最大和 力扣(LeetCode)官網(wǎng) - 全球極客摯愛的技術(shù)成長(zhǎng)平臺(tái) 給

    2024年02月12日
    瀏覽(20)
  • leetCode 131.分割回文串 + 動(dòng)態(tài)規(guī)劃 + 回溯算法 + 優(yōu)化 + 圖解 + 筆記

    leetCode 131.分割回文串 + 動(dòng)態(tài)規(guī)劃 + 回溯算法 + 優(yōu)化 + 圖解 + 筆記

    我的往期文章: leetCode 647.回文子串 動(dòng)態(tài)規(guī)劃 + 優(yōu)化空間 / 中心擴(kuò)展法 + 雙指針-CSDN博客 https://blog.csdn.net/weixin_41987016/article/details/133883091?spm=1001.2014.3001.5501 leetCode 131.分割回文串 + 回溯算法 + 圖解 + 筆記-CSDN博客 https://blog.csdn.net/weixin_41987016/article/details/134700907?spm=1001.2014.3001

    2024年02月05日
    瀏覽(65)
  • 3.數(shù)組算法、動(dòng)態(tài)規(guī)劃

    3.數(shù)組算法、動(dòng)態(tài)規(guī)劃

    Array是一個(gè)容器,可以容納固定數(shù)量的項(xiàng)目,這些項(xiàng)目應(yīng)該是相同的類型。大多數(shù)數(shù)據(jù)結(jié)構(gòu)都使用數(shù)組來實(shí)現(xiàn)其算法。以下是理解Array概念的重要術(shù)語。 元素 - 存儲(chǔ)在數(shù)組中的每個(gè)項(xiàng)稱為元素。 索引 - 數(shù)組中元素的每個(gè)位置都有一個(gè)數(shù)字索引,用于標(biāo)識(shí)元素。 可以使用不同語

    2024年02月16日
    瀏覽(26)
  • 數(shù)學(xué)建模-動(dòng)態(tài)規(guī)劃&遺傳算法(美賽運(yùn)用)

    數(shù)學(xué)建模-動(dòng)態(tài)規(guī)劃&遺傳算法(美賽運(yùn)用)

    動(dòng)態(tài)規(guī)劃模型的要素是對(duì)問題解決的抽象,其可分為: 階段。指對(duì)問題進(jìn)行解決的自然劃分。例如:在最短線路問題中,每進(jìn)行走一步的決策就是一個(gè)階段。 狀態(tài)。指一個(gè)階段開始時(shí)的自然狀況。例如:在最短線路問題中,每進(jìn)行走一步后,對(duì)所走的點(diǎn)進(jìn)行標(biāo)注。 決策。當(dāng)

    2024年03月13日
    瀏覽(25)
  • 動(dòng)態(tài)規(guī)劃:路徑和子數(shù)組問題(C++)

    動(dòng)態(tài)規(guī)劃:路徑和子數(shù)組問題(C++)

    1.不同路徑(中等) 鏈接:不同路徑 題目描述 做題步驟 狀態(tài)表示 嘗試 定義狀態(tài)表示為到達(dá)[m, n]位置的路徑數(shù) 。 狀態(tài)轉(zhuǎn)移方程 通過上述分析,可知狀態(tài)轉(zhuǎn)移方程為: dp[i][j] = dp[i - 1][j] + dp[i][j - 1] 。 初始化 填表順序 保證填當(dāng)前狀態(tài)時(shí),所需狀態(tài)已經(jīng)計(jì)算過,從起點(diǎn)出發(fā),

    2024年02月10日
    瀏覽(17)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包