LeetCode 每日一題 [18] 和為s的連續(xù)正數(shù)序列

LeetCode 面試題57 - II. 和為s的連續(xù)正數(shù)序列 [簡(jiǎn)單]

輸入一個(gè)正整數(shù) target 石挂,輸出所有和為 target 的連續(xù)正整數(shù)序列(至少含有兩個(gè)數(shù))儿惫。

序列內(nèi)的數(shù)字由小到大排列副瀑,不同序列按照首個(gè)數(shù)字從小到大排列晰搀。

來(lái)源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof

示例 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

題目分析:
解法1:

暴力法:每個(gè)都進(jìn)行嘗試蕉拢,然后把符合條件的數(shù)據(jù)存儲(chǔ)到集合中去

解法2:

數(shù)學(xué)法:a為首項(xiàng),共n項(xiàng)刻两,間距為1
a -> a + n -1 增蹭,即 target = (a + a + n -1)n/2

解法3:

算法是先找到符合的連續(xù)的2個(gè)數(shù)之和,然后符合的連續(xù)3個(gè)數(shù)磅摹,這樣子遞增的滋迈。例如9,先找符合的連續(xù)兩個(gè)數(shù)是4+5=4+(4+1)户誓,連續(xù)的三個(gè)數(shù)是2+3+4=2+(2+1)+(2+2)饼灿。難點(diǎn)是,我們能如何找到連續(xù)兩個(gè)數(shù)開頭的4和連續(xù)三個(gè)數(shù)的2帝美,我們就可以根據(jù)開頭的數(shù)自增就可以了碍彭。

設(shè)第一個(gè)值為a,一共有n個(gè)數(shù),那么 ((a+a+n-1)/2)n=target, 推導(dǎo)得 a=(target-n(n-1)/2)/n, n(n-1)/2 是1到n-1的和硕旗,所以要target-=i++,然后就是一個(gè)個(gè)是n了女责。

代碼實(shí)現(xiàn)
public class LeetCode_18_ContinuousPositiveSequenceWithSumS {
    public static void main(String[] args) {
        int[][] cs = findContinuousSequence(9);
        int[][] cs2 = findContinuousSequence02(9);
        for (int i = 0; i < cs.length; i++) {
            System.out.println(Arrays.toString(cs[i]));
        }
        System.out.println("==========================");
        for (int i = 0; i < cs2.length; i++) {
            System.out.println(Arrays.toString(cs[i]));
        }
    }

    public static int[][] findContinuousSequence03(int target) {
        // 雙指針漆枚,從前往后
        if (target <= 2) {
            return new int[][]{};
        }
        // 數(shù)學(xué)解法,太牛逼了
        // a為首項(xiàng)抵知,共n項(xiàng)墙基,間距為1
        // a -> a + n -1 ,即 target = (a + a + n -1)n/2
        List<int[]> res = new ArrayList<>();
        int a;
        for (int n = 2; n <= target; n++) {
            if ((2 * target - n * (n - 1)) % (2 * n) == 0) {
                a = (2 * target - n * (n - 1)) / (2 * n);
                if (a <= 0) {
                    break;
                }
                int[] cur = new int[n];
                for (int i = 0; i < n; i++) {
                    cur[i] = a + i;
                }
                res.add(cur);
            }
        }
        Collections.reverse(res);
        return res.toArray(new int[0][]);
    }

    /**
     * 這就有點(diǎn)詭異刷喜,在我本地 IDEA 可以通過(guò)残制,但是LeetCode 就不能通過(guò)
     */
    public static int[][] findContinuousSequence02(int target) {
        if (target <= 2) {
            return new int[][]{};
        }
        ArrayList<int[]> result = new ArrayList<>();
        int i = 1;
        while (target > 0) {
            target -= i++;
            if (target > 0 && target % i == 0) {
                int[] array = new int[i];
                for (int k = target / i, j = 0; k < target / i + 1; k++, j++) {
                    array[j] = k;
                }
                result.add(array);
            }
        }
        Collections.reverse(result);
        return result.toArray(new int[0][]);
    }

    /**
     * 暴力法
     */
    public static int[][] findContinuousSequence(int target) {
        List<int[]> res = new ArrayList<>();
        if (target <= 2) {
            return new int[][]{};
        }
        for (int i = 1; i < target / 2 + 1; i++) {
            int temp = target;
            int count = i;
            while (temp > 0) {
                temp = temp - count;
                count++;
            }
            if (temp == 0) {
                int[] arr = new int[count - i];
                int a = i;
                for (int j = 0; j < arr.length; j++) {
                    arr[j] = a;
                    a++;
                }
                res.add(arr);
            }
        }
        return res.toArray(new int[0][]);
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市掖疮,隨后出現(xiàn)的幾起案子初茶,更是在濱河造成了極大的恐慌,老刑警劉巖浊闪,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恼布,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡搁宾,警方通過(guò)查閱死者的電腦和手機(jī)折汞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)盖腿,“玉大人爽待,你說(shuō)我怎么就攤上這事◆娓” “怎么了鸟款?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)茂卦。 經(jīng)常有香客問(wèn)我欠雌,道長(zhǎng),這世上最難降的妖魔是什么疙筹? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任富俄,我火速辦了婚禮,結(jié)果婚禮上而咆,老公的妹妹穿的比我還像新娘霍比。我一直安慰自己,他們只是感情好暴备,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布悠瞬。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪浅妆。 梳的紋絲不亂的頭發(fā)上望迎,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天,我揣著相機(jī)與錄音凌外,去河邊找鬼辩尊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛康辑,可吹牛的內(nèi)容都是我干的摄欲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼疮薇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼胸墙!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起按咒,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤迟隅,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后励七,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體玻淑,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年呀伙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了补履。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡剿另,死狀恐怖箫锤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情雨女,我是刑警寧澤谚攒,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站氛堕,受9級(jí)特大地震影響馏臭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜讼稚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一括儒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧锐想,春花似錦帮寻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)浅蚪。三九已至,卻和暖如春烫罩,著一層夾襖步出監(jiān)牢的瞬間惜傲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工贝攒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留盗誊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓饿这,卻偏偏與公主長(zhǎng)得像浊伙,于是被迫代替她去往敵國(guó)和親撞秋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子长捧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360