基礎演算法 陣列配對

2021-10-03 07:56:19 字數 1298 閱讀 4765

description

陣列配對任務描述:給你乙個長度為n的陣列a和乙個正整數k,問從陣列中任選兩個數使其和是k的倍數,有多少種選法對於陣列a1=1,a2=2,a3=2而言:(a1,a2)和(a2,a1)被認為是同一種選法

input

輸入n,k,n<=1000000,k<=1000,第二行有n個整數,大小不超過1e9

output

輸出符合題意的選法個數

很容易想到兩個for迴圈,然後i和j相加取餘,但是這樣時間複雜度太大

根據((i%k)+(j%k))%k=0這個公式,我們可以想到,先把陣列中的陣列進行取餘然後計算相同餘數的個數,存放在另乙個陣列中。

for

(int i=

0;i)

在主函式中,我們可以只用1層for迴圈,我們可以使用i來表示j這裡的i和j都是代表的存放餘數陣列的下標,j=(k-i)%k,這裡的i是之前的乙個數%k後的值,我們要求另乙個數,根據((i%k)+(j%k))%k=0這個公式,另乙個數必須要和i相加等於0。

我們可以換個方式理解j=(k-i)%k,i和j都是乙個數同k取餘後的結果,我們要這兩個相加後再取餘k還等於0,那麼我們已知了i,所以j就可以求出來了,至於為什麼後面還要跟乙個%k,是因為有餘數等於0的情況,而k-0=k不符合題意

注意最後結果還要用long long

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int inf=

0x3f3f3f3f

;const

int max=

1e6+5;

int a[max];/*

陣列配對

從陣列中任意選擇兩個數,求其是k的倍數的配對有多少組

*/int

main()

int j=0;

for(

int i=

0;i)printf

("%lld\n"

,sum);}

return0;

}

基礎演算法 陣列元素目標和

問題 給定兩個公升序排序的有序陣列a和b,以及乙個目標值x。陣列下標從0開始。請你求出滿足a i b j x的數對 i,j 經驗 做這種型別的題目先使用暴力方法求解,然後分析其規律,再考慮優化解法,比如雙指標解法。1 暴力解法 時間複雜度o n n for int i 0 i n i for int...

簡單演算法 陣列

1.給定乙個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。param nums return var removeduplicates function nums prices return var maxprofit function prices pa...

leetcode基礎演算法 陣列篇 移動零

給定乙個陣列nums,編寫乙個函式將所有0移動到陣列的末尾,同時保持非零元素的相對順序。示例 輸入 0,1,0,3,12 輸出 1,3,12,0,0 說明 必須在原陣列上操作,不能拷貝額外的陣列。儘量減少操作次數。思路 原地把所有零移到陣列最後面,保持非零元素次序不變。思路 假設乙個陣列有n個元素 ...