1. 程式人生 > 實用技巧 >if-else結構

if-else結構

劍指 Offer 57 - II. 和為s的連續正數序列 輸入一個正整數 target ,輸出所有和為 target 的連續正整數序列(至少含有兩個數)。 序列內的數字由小到大排列,不同序列按照首個數字從小到大排列。 示例 1: 輸入:target = 9
輸出:[[2,3,4],[4,5]]
示例 2: 輸入:target = 15
輸出:[[1,2,3,4,5],[4,5,6],[7,8]]
限制:
1 <= target <= 10^5 思路: 我們用兩個指標 l 和 r 表示當前列舉到的以 l 為起點到 r 的區間,sum 表示 [l,r] 的區間和,由求和公式可 O(1) 求得為 sum=(l+r)∗(r−l+1)/2,起始 l=1,r=2.
一共有三種情況: 如果 sum<target 則說明指標 r 還可以向右拓展使得 sum 增大,此時指標 r 向右移動,即 r+=1
如果 sum>target 則說明以 l 為起點不存在一個 r 使得 sum=target,此時要列舉下一個起點,指標 lll 向右移動,即 l+=1
如果 sum==target 則說明我們找到了以 l 為起點得合法解 [l,r],我們需要將 [l,r] 的序列放進答案陣列,且我們知道以 l 為起點的合法解最多隻有一個,所以需要列舉下一個起點,指標 l 向右移動,即 l+=1 終止條件即為 l>=r 的時候,這種情況的發生指標 r 移動到了⌊target2⌋+1 的位置,導致 l<r的時候區間和始終大於 target。
該方法就是考慮到了如果已知 [l,r] 的區間和等於 target ,那麼列舉下一個起點的時候,區間 [l+1,r] 的和必然小於 target ,我們就不需要再從 l+1 再開始重複列舉,而是從 r+1 開始列舉,充分的利用了已知的資訊來優化時間複雜度。 程式碼:
class
Solution { public: vector<vector<int>> findContinuousSequence(int target) { int left = 1, right = 2; unsigned int sum; vector<vector<int>> result; vector<int> temp = {}; while(left!=right) { sum = (left+right) * (right-left+1
) / 2; if(sum==target) { temp.clear(); for(int i = left; i<=right; i++) { temp.push_back(i); } result.push_back(temp); left++; } else if(sum<target) { right++; } else{ left++; } } return result; } };