19-01-14:45 jump game II腰湾,55 jump game, 51 n-queens

55 jump game

Given an array of non-negative integers, you are initially positioned at the first index of the array.

Each element in the array represents your maximum jump length at that position.

Determine if you are able to reach the last index.

測試用例:

Example 1:

Input:[2,3,1,1,4]

Output:true

Explanation: Jump 1 step from index 0 to 1, then 3 steps to the last index.

Example 2:

Input:[3,2,1,0,4]

Output:false

Explanation: You will always arrive at index 3 no matter what. Its maximum jump length is 0, which makes it impossible to reach the last index.

經(jīng)典算法分類:這道題目可以分類到動態(tài)規(guī)劃中,當(dāng)然還有貪心和回溯的解法捅厂。

題目思考:給定一個非負(fù)數(shù)組探橱,難點(diǎn)在于記錄從上一點(diǎn)到下一點(diǎn)的跳躍能力轉(zhuǎn)換。

動態(tài)規(guī)劃的思路:建立一個dp數(shù)組蛮放,建立上一個元素和下一個元素的關(guān)系(類似階躍函數(shù))缩抡。找到最遠(yuǎn)的那個位置,并記錄下來包颁。

想清楚怎么轉(zhuǎn)換就可以直接寫了瞻想。

代碼:


    public boolean canJump(int[] nums) {

        int len = nums.length;

        int dp[] = new int[len];

        dp[0] = nums[0];



            for(int i = 1; i < len; i ++){

                if(i <= dp[i-1]){

                    dp[i] = Math.max(dp[i-1],i + nums[i]);

                }



                else{

                    dp[i] = dp[i-1] + nums[i];

                /*update the value of the array dp*/

                }         

}



                return dp[len-1]>=len-1;

    }

}

問題:跑不過[3,2,1,0,4]這個測試用例挎塌。哪里出了問題?

貪心版本:
思路:記錄現(xiàn)在能跳到的最遠(yuǎn)距離内边。

    public boolean canJump(int[] nums) {
        int len = nums.length;
        int dp[] = new int [len];
        int max = nums[0];
        for(int i = 1;i < len; i++){
            if(i > max || max >= len-1){
                return max >= len -1;
            }
            max = Math.max(max, i + nums[i]);
        }
         return max >= len -1;
            
    }
}

Runtime: 8 ms, faster than 65.15% of Java online submissions for Jump Game.

Time complexity: O(n). We are doing a single pass through the nums array, hence nn steps, where n is the length of array nums.

Space complexity: O(1). We are not using any extra memory.

45 jump game II

Given an array of non-negative integers, you are initially positioned at the first index of the array.

Each element in the array represents your maximum jump length at that position.

Your goal is to reach the last index in the minimum number of jumps.

Example:

Input: [2,3,1,1,4]
Output: 2
Explanation: The minimum number of jumps to reach the last index is 2.
Jump 1 step from index 0 to 1, then 3 steps to the last index.
Note:

You can assume that you can always reach the last index.

思路:
動態(tài)規(guī)劃的時間復(fù)雜度是O(n^2 )或者O( n^3)(沒想清楚具體是哪個)。過大待锈。

class Solution {
    public int jump(int[] nums) {
        int len = nums.length;
        int dp[] = new int[len];
        dp[0] = 0;
        int currMax = 0;
        int currIndex = 0;
        int max =nums[0];
    for(int i = 1; i < len; i++){
        currMax = Math.max(currMax, i + nums[i]);
        if(i< max){
            dp[i] = dp[currIndex] +1;
            
        }else{
            dp[i] = dp[currIndex] +1;
            max = currMax;
            currIndex = i;
        }

    }
                return dp[nums.length-1];

        
}
}

修改版漠其,沒有建立額外的數(shù)組。保持空間復(fù)雜度為O(1)竿音。

class Solution {
    public int jump(int[] nums) {
       
        int len = nums.length;
        int dp[] = new int[len];
        dp[0] = 0;
        int step = 0;
        int max =nums[0];
        int currMax = max;
        if(len == 1) return 0;
        if(max >= len && len > 1){
            step++;
            return step;
        } 
    for(int i = 0; i < len; i++){
        currMax = Math.max(currMax, i + nums[i]);
        if(i < max){
        }else{
            max = currMax;
            step ++;
        }

    }
                return step;
        
}
}

測試[1,2,3] 有問題和屎。

貪心版本:
貪心思路:
記錄能走到的最遠(yuǎn)距離farest, 現(xiàn)在的位置curr以及步數(shù)step。
來自leeetcode討論區(qū):

class Solution {
    public int jump(int[] nums) {
        int len = nums.length;
        int step = 0;
        int farest = 0;
        int curr = 0;
        for (int i = 0; i < len; i++) {
            if (i > farest) {
                farest = curr;
                step++;
            }
            curr = Math.max(curr, i+nums[i]);
        }

        return step;
        
}
}

只掃描一遍春瞬,直接判斷柴信。

51. N-Queens

經(jīng)典的回溯問題,同時涉及到分枝限界宽气。

回溯的套路:構(gòu)造解空間(狀態(tài)空間樹(state space tree))随常,用回溯法搜索解空間,并使用分枝限界舍去無效分枝萄涯。

大致思路:

1.更新行與列的參數(shù)绪氛,從給定棋盤第一行,第一列開始涝影。
2.判斷當(dāng)前位置是否在前后兩角共四個方向中枣察,都不存在另一個皇后棋子。

3.如果滿足:
在當(dāng)前位置放一個皇后燃逻,若當(dāng)前行是最后一行序目,記錄一個解;
若當(dāng)前行不是最后一行伯襟,當(dāng)前行設(shè)為下一行, 當(dāng)前列設(shè)為當(dāng)前行的第一個待測位置猿涨;
若當(dāng)前行是最后一行,當(dāng)前列不是最后一列姆怪,當(dāng)前列設(shè)為下一列嘿辟;
若當(dāng)前行是最后一行,當(dāng)前列是最后一列片效,回溯红伦,即清空當(dāng)前行及以下各行的棋盤,然后淀衣,當(dāng)前行設(shè)為上一行昙读,當(dāng)前列設(shè)為當(dāng)前行的下一個待測位置。
以上返回到第2步

4.在當(dāng)前位置上不滿足條件的情形:
若當(dāng)前列不是最后一列膨桥,當(dāng)前列設(shè)為下一列蛮浑,返回到第2步;
若當(dāng)前列是最后一列了唠叛,回溯,即沮稚,若當(dāng)前行已經(jīng)是第一行了艺沼,算法退出,否則蕴掏,清空當(dāng)前行及以下各行的棋盤障般,然后,當(dāng)前行設(shè)為上一行盛杰,當(dāng)前列設(shè)為當(dāng)前行的下一個待測位置挽荡,返回到第2步;

我發(fā)現(xiàn)這種類型的題目我在去年夏天寫過。當(dāng)時剛學(xué)遞歸即供,完成了一個類似思路的走迷宮問題定拟。迭代或者遞歸都可以處理。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末逗嫡,一起剝皮案震驚了整個濱河市青自,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌驱证,老刑警劉巖性穿,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異雷滚,居然都是意外死亡需曾,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門祈远,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呆万,“玉大人,你說我怎么就攤上這事车份∧奔酰” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵扫沼,是天一觀的道長出爹。 經(jīng)常有香客問我,道長缎除,這世上最難降的妖魔是什么严就? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮器罐,結(jié)果婚禮上梢为,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好铸董,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布祟印。 她就那樣靜靜地躺著,像睡著了一般粟害。 火紅的嫁衣襯著肌膚如雪蕴忆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天悲幅,我揣著相機(jī)與錄音套鹅,去河邊找鬼。 笑死夺艰,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的沉衣。 我是一名探鬼主播郁副,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼豌习!你這毒婦竟也來了存谎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤肥隆,失蹤者是張志新(化名)和其女友劉穎既荚,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體栋艳,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡恰聘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了吸占。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晴叨。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖矾屯,靈堂內(nèi)的尸體忽然破棺而出兼蕊,到底是詐尸還是另有隱情,我是刑警寧澤件蚕,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布孙技,位于F島的核電站,受9級特大地震影響排作,放射性物質(zhì)發(fā)生泄漏牵啦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一妄痪、第九天 我趴在偏房一處隱蔽的房頂上張望蕾久。 院中可真熱鬧,春花似錦、人聲如沸僧著。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盹愚。三九已至栅迄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間皆怕,已是汗流浹背毅舆。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留愈腾,地道東北人憋活。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像虱黄,于是被迫代替她去往敵國和親悦即。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容