LeetCode.跳躍游戲VII

跳躍游戲VII(dp)

1.題目描述

??給你一個(gè)下標(biāo)從 0 開始的二進(jìn)制字符串 s 和兩個(gè)整數(shù) minJump 和 maxJump 。一開始,你在下標(biāo) 0 處,且該位置的值一定為 '0' 。當(dāng)同時(shí)滿足如下條件時(shí),你可以從下標(biāo) i 移動(dòng)到下標(biāo) j 處:

  • i + minJump <= j <= min(i + maxJump, s.length - 1) 且 s[j] == '0'.
    ?如果你可以到達(dá) s 的下標(biāo) s.length - 1 處,請你返回 true ,否則返回 false 。
    原題鏈接:https://leetcode-cn.com/problems/jump-game-vii
2.簡析

??這道題的數(shù)據(jù)范圍是2 <= s.length <= 10^5,s[i] \in \{'0','1'\}; 因此這里考慮采用O(n)復(fù)雜度的算法,首先考慮dp;首先定義一個(gè)數(shù)組f[n],f[i]表示是否能移動(dòng)到當(dāng)前下標(biāo)i。而能否移動(dòng)到下標(biāo) i 取決于之前的狀態(tài),當(dāng)s[i]=='1',f[i]=0; 否則其狀態(tài)轉(zhuǎn)移方程如下:
f[i] = \sum_{j = max(0, i-maxJump)}^{min(0, i-minJump)}{f[j]} > 0
但是針對每個(gè)下標(biāo)點(diǎn) i,都需要遍歷前面 [i-maxJump, i-minJump]的元素,算法復(fù)雜度仍為 O(n^2)。由于這里是求這個(gè)范圍內(nèi)是否存在1,因此可以采用前綴和進(jìn)行優(yōu)化,在dp過程中同時(shí)記錄前綴和,然后狀態(tài)轉(zhuǎn)移的時(shí)候可以利用前綴和在O(1)的時(shí)間復(fù)雜度內(nèi)判斷當(dāng)坐標(biāo)點(diǎn)是否可以由目標(biāo)區(qū)間內(nèi)某點(diǎn)轉(zhuǎn)移而來,最終整個(gè)算法的復(fù)雜度為O(n)

3.代碼示例
bool canReach(string s, int minJump, int maxJump) {
        int n = s.size();
        if(s[n-1] == '1') return false;
        int presum[n+1], f[n];
        memset(presum, 0, sizeof presum);
        memset(f, 0, sizeof f);
        f[0] = presum[1] = 1;
        for(int i=1; i<n; ++i){
            if(s[i] == '0' && i >= minJump){
               f[i] = presum[i+1-minJump] - presum[max(0, i-maxJump)] > 0? 1 : 0;
            }
            presum[i+1] = presum[i] + f[i];
        }
        return f[n-1]>0;
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 退役挺久了,現(xiàn)在寫題竟是很慢了,不敢說自己打過ACM,LeetCode上的題似乎在面試的時(shí)候容易被問到,就寫寫,來...
    hdychi閱讀 349評論 0 0
  • LeetCode 刷題隨手記 - 第一部分 前 256 題(非會(huì)員),僅算法題,的吐槽 https://leetc...
    蕾娜漢默閱讀 18,392評論 2 36
  • 為了給刷題的同學(xué)一些獎(jiǎng)勵(lì),力扣團(tuán)隊(duì)引入了一個(gè)彈簧游戲機(jī)。游戲機(jī)由 N 個(gè)特殊彈簧排成一排,編號(hào)為 0 到 N-1。...
    _NewMoon閱讀 736評論 0 2
  • 讀完本文,你可以去力扣拿下如下題目: 55.跳躍游戲[https://leetcode-cn.com/proble...
    labuladong閱讀 917評論 0 3
  • 給定一個(gè)非負(fù)整數(shù)數(shù)組 nums ,你最初位于數(shù)組的 第一個(gè)下標(biāo) 。數(shù)組中的每個(gè)元素代表你在該位置可以跳躍的最大長度...
    Shimmer_閱讀 226評論 0 1

友情鏈接更多精彩內(nèi)容