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

【動態(tài)規(guī)劃】C++算法:446等差數(shù)列劃分 II - 子序列

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

作者推薦

視頻算法專題

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

動態(tài)規(guī)劃匯總

446. 等差數(shù)列劃分 II - 子序列

給你一個(gè)整數(shù)數(shù)組 nums ,返回 nums 中所有 等差子序列 的數(shù)目。
如果一個(gè)序列中 至少有三個(gè)元素 ,并且任意兩個(gè)相鄰元素之差相同,則稱該序列為等差序列。
例如,[1, 3, 5, 7, 9]、[7, 7, 7, 7] 和 [3, -1, -5, -9] 都是等差序列。
再例如,[1, 1, 2, 5, 7] 不是等差序列。
數(shù)組中的子序列是從數(shù)組中刪除一些元素(也可能不刪除)得到的一個(gè)序列。
例如,[2,5,10] 是 [1,2,1,2,4,1,5,10] 的一個(gè)子序列。
題目數(shù)據(jù)保證答案是一個(gè) 32-bit 整數(shù)。
示例 1:
輸入:nums = [2,4,6,8,10]
輸出:7
解釋:所有的等差子序列為:
[2,4,6]
[4,6,8]
[6,8,10]
[2,4,6,8]
[4,6,8,10]
[2,4,6,8,10]
[2,6,10]
示例 2:
輸入:nums = [7,7,7,7,7]
輸出:16
解釋:數(shù)組中的任意子序列都是等差子序列。
參數(shù)范圍
1 <= nums.length <= 1000
-231 <= nums[i] <= 231 - 1

動態(tài)規(guī)劃

時(shí)間復(fù)雜度??(nn)
空間復(fù)雜度??(nn)

變量解析

長度大于2的稱為等差子序列,長度等于2的不妨稱為“準(zhǔn)等差”。

mSubCount1 mSubCount1[i][sub]表示以nums[i]結(jié)尾,差為sub的“準(zhǔn)等差”數(shù)量。
mSubCount2 mSubCount2[i][sub]表示以nums[i]結(jié)尾,差為sub的等差數(shù)列的數(shù)量。

動態(tài)規(guī)劃的細(xì)節(jié),方便檢查

兩層循環(huán),分別枚舉等差數(shù)列的最后一個(gè)元素和倒數(shù)第二個(gè)元素。

動態(tài)規(guī)劃的狀態(tài)表示 mSubCount1 和mSubCount2
動態(tài)規(guī)劃的轉(zhuǎn)移方程 mSubCount2 [i][sub] +=mSubCount1 [j][sub]+ mSubCount2 [j][sub] mSubCount1[i][sub]++
動態(tài)規(guī)劃的初始狀態(tài)
動態(tài)規(guī)劃的填表順序 i和j都是從小到大處理,確保動態(tài)規(guī)劃的無后效性
動態(tài)規(guī)劃的返回值 Sumi,submSubCount2[i][sub]

代碼

核心代碼

class Solution {
public:
	int numberOfArithmeticSlices(vector<int>& nums) {
		m_c = nums.size();
		vector<unordered_map<long long, int>> mSubCount1(m_c), mSubCount2(m_c);
		int iRet = 0;
		for (int i = 1; i < m_c; i++)
		{
			for (int j = 0; j < i; j++)
			{
				const long long sub = (long long)nums[i] - nums[j];
				if (mSubCount2[j].count(sub))
				{
					mSubCount2[i][sub] += mSubCount2[j][sub];
				}
				if (mSubCount1[j].count(sub))
				{
					mSubCount2[i][sub] += mSubCount1[j][sub];
				}
				mSubCount1[i][sub]++;				
			}
			for (const auto& [_tmp,cnt] : mSubCount2[i])
			{
				iRet += cnt;
			}
		}
		return iRet;
	}
	int m_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,1,1,1 };
		auto res = sln.numberOfArithmeticSlices(nums);
		Assert(5, res);
	}
	{
		Solution sln;
		nums = { 2, 4, 6, 8, 10 };
		auto res = sln.numberOfArithmeticSlices(nums);
		Assert(7, res);
	}
	{
		Solution sln;
		nums = { 7,7,7,7,7 };
		auto res = sln.numberOfArithmeticSlices(nums);
		Assert(16, res);
	}

	{
		Solution sln;
		nums = { 0, 2000000000, -294967296 };
		auto res = sln.numberOfArithmeticSlices(nums);
		Assert(16, res);
	}


}

可以優(yōu)化掉一個(gè)變量

class Solution {
public:
int numberOfArithmeticSlices(vector& nums) {
m_c = nums.size();
vector<unordered_map<long long, int>> mSubCount(m_c);
int iRet = 0;
for (int i = 1; i < m_c; i++)
{
for (int j = 0; j < i; j++)
{
const long long sub = (long long)nums[i] - nums[j];
if (mSubCount[j].count(sub))
{
mSubCount[i][sub] += mSubCount[j][sub];
iRet += mSubCount[j][sub];
}
mSubCount[i][sub]++;
}
}
return iRet;
}
int m_c;
};

2023年1月版

class Solution {
public:
int numberOfArithmeticSlices(vector& nums) {
m_c = nums.size();
vector<std::unordered_map<long long, int>> dp(m_c);
int iRet = 0;
for (int i = 0; i < m_c; i++)
{
for (int j = 0; j < i; j++)
{
long long tmp = 1LL * nums[i] - nums[j];
auto it = dp[j].find(tmp);
int iNum = (dp[j].end() == it) ? 0 : it->second ;
iRet += iNum;
dp[i][tmp] += iNum + 1;
}
}
return iRet;
}
int m_c;
};

【動態(tài)規(guī)劃】C++算法:446等差數(shù)列劃分 II - 子序列,# 算法題,算法,動態(tài)規(guī)劃,c++,leetcode,子序列,等差數(shù)列,數(shù)量

擴(kuò)展閱讀

視頻課程

有效學(xué)習(xí):明確的目標(biāo) 及時(shí)的反饋 拉伸區(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

我想對大家說的話
聞缺陷則喜是一個(gè)美好的愿望,早發(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++**實(shí)現(xiàn)。

【動態(tài)規(guī)劃】C++算法:446等差數(shù)列劃分 II - 子序列,# 算法題,算法,動態(tài)規(guī)劃,c++,leetcode,子序列,等差數(shù)列,數(shù)量文章來源地址http://www.zghlxwxcb.cn/news/detail-778939.html

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

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

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

相關(guān)文章

  • 【C語言藍(lán)橋杯每日一題】——等差數(shù)列

    【C語言藍(lán)橋杯每日一題】——等差數(shù)列

    ? ? ??博客昵稱:博客小夢 ??最喜歡的座右銘:全神貫注的上吧?。?! ??作者簡介:一名熱愛C/C++,算法等技術(shù)、喜愛運(yùn)動、熱愛K歌、敢于追夢的小博主! ??博主小留言:哈嘍! ??各位CSDN的uu們,我是你的博客好友小夢,希望我的文章可以給您帶來一定的幫助,話不

    2023年04月09日
    瀏覽(29)
  • 華為OD機(jī)試真題 Java 實(shí)現(xiàn)【等差數(shù)列】【2023 B卷 100分】,附詳細(xì)解題思路

    華為OD機(jī)試真題 Java 實(shí)現(xiàn)【等差數(shù)列】【2023 B卷 100分】,附詳細(xì)解題思路

    本專欄收錄于《華為OD機(jī)試(JAVA)真題(A卷+B卷)》。 刷的越多,抽中的概率越大 ,每一題都有詳細(xì)的答題思路、詳細(xì)的代碼注釋、樣例測試,訂閱后,專欄內(nèi)的文章都可看,可加入華為OD刷題群(私信即可),發(fā)現(xiàn)新題目,隨時(shí)更新,全天CSDN在線答疑。 專欄福利 :限時(shí)訂

    2024年02月16日
    瀏覽(28)
  • 藍(lán)橋杯專題-真題版含答案-【九宮幻方】【打魚還是曬網(wǎng)】【階乘尾數(shù)零的個(gè)數(shù)】【等差素?cái)?shù)列】

    藍(lán)橋杯專題-真題版含答案-【九宮幻方】【打魚還是曬網(wǎng)】【階乘尾數(shù)零的個(gè)數(shù)】【等差素?cái)?shù)列】

    點(diǎn)擊跳轉(zhuǎn)專欄=Unity3D特效百例 點(diǎn)擊跳轉(zhuǎn)專欄=案例項(xiàng)目實(shí)戰(zhàn)源碼 點(diǎn)擊跳轉(zhuǎn)專欄=游戲腳本-輔助自動化 點(diǎn)擊跳轉(zhuǎn)專欄=Android控件全解手冊 點(diǎn)擊跳轉(zhuǎn)專欄=Scratch編程案例 點(diǎn)擊跳轉(zhuǎn)=軟考全系列 點(diǎn)擊跳轉(zhuǎn)=藍(lán)橋系列 專注于 Android/Unity 和各種游戲開發(fā)技巧,以及 各種資源分享 (網(wǎng)站、

    2024年02月15日
    瀏覽(21)
  • C++算法 —— 動態(tài)規(guī)劃(1)斐波那契數(shù)列模型

    C++算法 —— 動態(tài)規(guī)劃(1)斐波那契數(shù)列模型

    每一種算法都最好看完第一篇再去找要看的博客,因?yàn)檫@樣會幫你梳理好思路,看接下來的博客也就更輕松了。當(dāng)然,我也會盡量在寫每一篇時(shí)都可以讓不懂這個(gè)算法的人也能邊看邊理解。 動規(guī)的思路有五個(gè)步驟,且最好畫圖來理解細(xì)節(jié),不要怕麻煩。當(dāng)你開始畫圖,仔細(xì)閱

    2024年02月10日
    瀏覽(23)
  • 【算法學(xué)習(xí)】斐波那契數(shù)列模型-動態(tài)規(guī)劃

    【算法學(xué)習(xí)】斐波那契數(shù)列模型-動態(tài)規(guī)劃

    ? ? ? ? 我在算法學(xué)習(xí)過程中,針對斐波那契數(shù)列模型的動態(tài)規(guī)劃的例題進(jìn)行了一個(gè)整理,并且根據(jù)標(biāo)準(zhǔn)且可靠一點(diǎn)的動態(tài)規(guī)劃解題思路進(jìn)行求解類似的動歸問題,來達(dá)到學(xué)習(xí)和今后復(fù)習(xí)的必要。 ? ? ? ? 所謂的斐波那契數(shù)列模型,即當(dāng)前狀態(tài)的值等于前兩種狀態(tài)的值之和。

    2024年02月04日
    瀏覽(27)
  • 【算法優(yōu)選】 動態(tài)規(guī)劃之斐波那契數(shù)列模型

    動態(tài)規(guī)劃相關(guān)題目都可以參考以下五個(gè)步驟進(jìn)行解答: 狀態(tài)表? 狀態(tài)轉(zhuǎn)移?程 初始化 填表順序 返回值 后面題的解答思路也將按照這五個(gè)步驟進(jìn)行講解。 泰波那契序列 Tn 定義如下: T0 = 0, T1 = 1, T2 = 1, 且在 n = 0 的條件下 Tn+3 = Tn + Tn+1 + Tn+2 給你整數(shù) n,請返回第 n 個(gè)泰波那契

    2024年02月05日
    瀏覽(25)
  • 動態(tài)規(guī)劃入門:斐波那契數(shù)列模型以及多狀態(tài)(C++)

    動態(tài)規(guī)劃入門:斐波那契數(shù)列模型以及多狀態(tài)(C++)

    ????動態(tài)規(guī)劃(Dynamic programming,簡稱 DP)是一種解決多階段決策問題的算法思想。它將問題分解為多個(gè)階段,并通過保存中間結(jié)果來避免重復(fù)計(jì)算,從而提高效率。 動態(tài)規(guī)劃的解題步驟一般分為以下幾步: 思考狀態(tài)表示,創(chuàng)建dp表(重點(diǎn)) 分析出狀態(tài)轉(zhuǎn)移方程(重點(diǎn)) 初始化 確定

    2024年02月11日
    瀏覽(25)
  • Java數(shù)據(jù)結(jié)構(gòu)與算法:動態(tài)規(guī)劃之斐波那契數(shù)列

    大家好,我是免費(fèi)搭建查券返利機(jī)器人賺傭金就用微賺淘客系統(tǒng)3.0的小編。在這寒冷的季節(jié)里,讓我們一同探討Java中的動態(tài)規(guī)劃,重點(diǎn)關(guān)注解決問題的經(jīng)典代表之一——斐波那契數(shù)列。 動態(tài)規(guī)劃簡介 動態(tài)規(guī)劃是一種解決問題的數(shù)學(xué)方法,通常用于優(yōu)化遞歸算法。它通過將問

    2024年01月22日
    瀏覽(21)
  • P1025 [NOIP2001 提高組] 數(shù)的劃分———C++(動態(tài)規(guī)劃、DFS)

    P1025 [NOIP2001 提高組] 數(shù)的劃分———C++(動態(tài)規(guī)劃、DFS)

    將整數(shù) n n n 分成 k k k 份,且每份不能為空,任意兩個(gè)方案不相同(不考慮順序)。 例如: n = 7 n=7 n = 7 , k = 3 k=3 k = 3 ,下面三種分法被認(rèn)為是相同的。 1 , 1 , 5 1,1,5 1 , 1 , 5 ; 1 , 5 , 1 1,5,1 1 , 5 , 1 ; 5 , 1 , 1 5,1,1 5 , 1 , 1 . 問有多少種不同的分法。 n , k n,k n , k ( 6 n ≤ 200 6n le

    2024年01月22日
    瀏覽(15)
  • 算法題——華為OD機(jī)試——整數(shù)劃分排序/員工分月餅——?jiǎng)討B(tài)規(guī)劃——Java

    一個(gè)考察動態(tài)規(guī)劃的機(jī)試題的數(shù)學(xué)模型建立,和兩種思路的取舍 公司分月餅,m個(gè)員工,買了n個(gè)月餅,m = n,每個(gè)員工至少分一個(gè)月餅,但是也可以分到多個(gè),單人分到最多月餅的個(gè)數(shù)是Max1,單人分到第二多月餅個(gè)數(shù)是Max2。 但需要滿足Max1-Max2 = 3,單人分到第n-1多月餅個(gè)數(shù)是

    2024年03月16日
    瀏覽(24)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包