今天在做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,...