題目:輸入乙個已經按公升序排序過的陣列和乙個數字,
在陣列中查詢兩個數,使得它們的和正好是輸入的那個數字。
要求時間複雜度是o(n)。如果有多對數字的和等於輸入的數字,輸出任意一對即可
例如輸入陣列1、2、4、7、11、15和數字15。由於4+11=15,因此輸出4和11
方案一:
int iarrary[10] = ;
//先排序,就暫時選個簡單的來排序吧
for(int i = 0; i < 9; i++)
int j;
int swap;
int minindex = i;
for(j = i+1; j < 10; j++)
if(iarray[minindex] > iarray[j])
minindex = j;
else
continue;
swap = iarray[minindex];
iarray[minindex] = iarray[i];
iarray[i] = swap;
//求漸進大小的數
int ihead = 0, itail = 9;
while( ihead != itail)
if(iarray[ihead] + iarray[itail] > sum)
itail--;
else if(iarray[ihead] + iarray[itail] < sum)
ihead++;
else if(iarray[ihead] + iarray[itail] == sum)
printf("%d:%d, %d,%d/n", ihead,iarray[ihead], itail, iarray[itail]);
else
printf("cannot find the sum/n");
方案二:
假設給定陣列元素為m個,即:src[m],給定的和為sum,我們首先開闢sum個陣列空間tmp[sum],初始值都為0,
然後從頭到尾遍歷給定,對於src[i],我們查詢tmp[sum-src[i]]是否為1,如果為1,輸出兩個數即可,否則
將tmp[src[i]]置為1(即此數已經存在),這樣只需遍歷一次即可找出所有的一對數。
缺點:以上演算法有兩個明顯缺點,
1. 演算法假定所給數都為非負數,當為負數時下標無效
解決方法:判斷第乙個數是否為負數(公升序),若為負數,給所有數都加上第乙個數的相反數,使得都為正即可
2.分析演算法的空間複雜度:假如極端情況m很小且sum非常大,這樣我們浪費了巨大的空間(例如m=10,sum=1億)
解決方法:使用hash雜湊的方法,這就是我們要說的方法二
解法三:
針對方法一空間複雜度的問題,提出hash雜湊的方法,hash函式為f(x) = x mod m
hash雜湊空間大小設定為m/0.8來減少衝突,hash空間初始值全部置為null,
對於有衝突的解決,我們使用線性鍊錶的儲存方式,先定義鍊錶節點
view plaincopy to clipboardprint?
01.typedef struct _node
02.node;
typedef struct _node
node;
遍歷給定陣列,像解法一一樣,對於首項為負的數字,加上其相反數即可,
對於掃瞄的每個數xi,我們查詢f(sum-xi)是否存在,如果存在,輸出兩個數,
否則繼續遍歷下乙個數,直到所有數都遍歷完一遍,這樣一次掃瞄就可以找到
所有滿足條件的一對數。
演算法的具體實現待定...
阿里巴巴筆試題 求陣列中和為給定數所有的組合
一 問題描述 給定乙個數t,以及n個整數,在這n個數中找到加和為t的所有組合,例如t 4,n 6這6個數為 4,3,2,2,1,1 這樣輸出就有4個不同的組合它們的加和為4 4,3 1,2 2,and 2 1 1。請設計乙個高效演算法實現這個需求。二 解題思路 先將資料按從大到小進行排序,然後使用回...
第二十一題(求陣列中和為特定數的所有組合)
第21 題 2010 年中興面試題 程式設計求解 輸入兩個整數n 和m,從數列1,2,3.n 中隨意取幾個數,使其和等於m 要求將其中所有的可能組合列出來.採用遞迴的方式實現 每個數字參與求和或者不參與,通過鍊錶record記錄參與求和的數字 終止條件為index n,此時說明求和失敗 當index...
求陣列中和最大的子陣列
題目一 輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每 個子陣列都有乙個和。求所有子陣列的和的最大值。要求時間複雜度為o n cpp view plain copy include stdio.h include conio.h 求一維陣列的最大連續子陣列元素之...