找和為k的兩個元素

2021-08-04 20:59:00 字數 1372 閱讀 6287

今天在做coursera上的練習題時,遇到了乙個找和為k的兩個元素的問題,按照常規的方法,將資料存入陣列中,一次為每個數字遍歷陣列,找到是否存在和為k的元素,但是這樣的話時間複雜度為o(n^2),恰好前兩天剛看過快速排序的思想,發現,使用快速排序,可以優化降低時間複雜度。

找和為k的兩個元素

描述在乙個長度為n(n < 1000)的整數序列中,判斷是否存在某兩個元素之和為k。

輸入第一行輸入序列的長度n和k,用空格分開。

第二行輸入序列中的n個整數,用空格分開。

輸出如果存在某兩個元素的和為k,則輸出yes,否則輸出no。

樣例輸入

9 10

1 2 3 4 5 6 7 8 9

樣例輸出

yes
/*

* created on: 2023年8月3日

* author: karo

* **問題:輸入n,k,分別表示資料的長度和目標數字,在長度為n的資料中找到是否有兩個數相加等於k

* 解決思路:設定崗哨變數flag。如果k是偶數,flag = k/2+1;如果k是偶數 flag = k/2;

* 生命乙個長度為n+1的陣列,用於儲存flag和輸入的資料,並且令a[0] = flag;

* 如果k是偶數,遍歷陣列,找到是否有大於等於2的數字等於flag如果有列印yes,程式結束。

* 如果沒有和k是奇數一樣處理。

* k是奇數時,將陣列分為比flag大的資料和比k小的資料,用比flag大的數,去匹配比flag小的數。

*/#include

using

namespace

std;

int quicksort(int *v,int n)

v[low] = v[high];

while(low < high && v[low] >= key)

v[high] = v[low];

}v[low] = key;

return low;

return0;}

int findk(int *a,int n,int k, int flag)}}

cout

<<"no"

int main()

/** 判斷k是奇數還是偶數

*/if(k%2 == 1) else

}if(num>1)

// cout<}

a[0] = flag;

findk(a,n,k,flag);

return

0;}

和為K的兩個數

一 輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,使得他們的和正好是s,如果有多對數字的和等於s,輸出兩個數的乘積最小的。var array 1,3,5,8,10 var sum 13 function getarray array,sum return result console.lo...

兩個有序數序列中找第k小

description 已知兩個已經排好序 非減序 的序列x和y,其中x的長度為m,y長度為n,現在請你用分治演算法,找出x和y的第k小的數,演算法時間複雜度為o max 分析 既然說明了分治,那肯定是劃分為子問題。又已經排好序,模擬於二分查詢,每次丟棄一半,我們可以將x的一半元素與y的一半元素合併...

leetcode 找兩個和為目標值且不重疊的子陣列

給你乙個整數陣列 arr 和乙個整數值 target 請你在 arr 中找 兩個互不重疊的子陣列 且它們的和都等於 target 可能會有多種方案,請你返回滿足要求的兩個子陣列長度和的 最小值 請返回滿足要求的最小長度和,如果無法找到這樣的兩個子陣列,請返回 1 示例 1 輸入 arr 3,2,2,...