用了半小時才寫出來啊,
其實這種思路應用范圍很廣,利用有序性這個特點,比如本體只要是有序就行,例如兩個集合是有序的,求交集,有序數組的查找,有序數組的歸並,有序有了優化的可能。
輸入一個正數 n,輸出所有和為 n 連續正數序列
例如輸入 15,由於 1+2+3+4+5=4+5+6=7+8=15,所以輸出 3 個連續序列 1-5、4-6 和 7-8。
分析:我們用兩個數small和big分別表示序列的最小值和最大值。首先把small初始化為 1,big初始化為 2。如果從small到big的序列的和大於n的話,我們向右移動small,相當於從序列中去掉較小的數字。如果從small到big的序列的和小於n的話,我們向右移動big,相當於向序列中添加big的下一個數字。一直到small等於(1+n)/2,因為序列至少要有兩個數字。
package 連續和為n; import java.util.ArrayList; public class Main { //輸出一到n中連續和為n的正整數 public static void getAns(int n) { int beg=1; int sum=1; int cur=1; while(beg<=n/2+1) { if(sum==n) { for(int k=beg;k<=cur;k++) { System.out.print(k+" "); } System.out.println(); sum=sum-beg; beg++; cur++; sum+=cur; } if(sum>n) { sum=sum-beg; beg++; } else { cur++; sum+=cur; } // System.out.println("beg"+beg+"cur"+cur+"sum"+sum); } } public static void main(String[] args) { getAns(15); } }