【數據結構與算法】貪婪算法

每個階段都選擇局部最優,算法終止時,希望局部最優=全局最優,如果不相等,則得到的是一個次最優解。

L55. canJump

 /**
     * 給出一組非負數,每個數的意思是能跳幾步,然後看能不能跳到最後
     * @param nums
     * @return
     */
    public boolean canJump(int[] nums) {

        //貪心算法,從第一個位置,記錄能達到的最遠距離
        int len = nums.length-1;
        int curMax = nums[0];

        for(int i=0; i<=curMax; i++){ //這裏curMax,是能走到的最遠距離
            if(nums[i]+i >= len) return true;
            curMax = Math.max(curMax,nums[i]+i);
        }
        return false;
    }

L45.Jump2

 /** 順藤摸瓜
     * 求跳到最後的最少的跳躍次數
     * @param nums
     * @return
     */
    public int jump(int[] nums) {
        int end = 0; //能跳到的最後的邊界
        int maxPos = 0;
        int steps = 0;

        for(int i=0;i<nums.length-1;i++){
            //找能跳的最遠的
            maxPos = Math.max(nums[i]+i,maxPos);
            if(end == i){  //如果已經跳到本次邊界,則進行更新,否則繼續遍歷,找跳的最遠的max
                end = maxPos;
                steps++;
            }
        }
        return steps;
    }

    /**
     * 順瓜摸藤
     * @param nums
     * @return
     */
    public int jump2(int[] nums){
        int pos = nums.length -1;//當前指向的位置
        int steps = 0;

        while (pos !=0){
            for(int i=0; i< pos;i++){
                if(nums[i]+i >= pos){
                    pos = i;
                    steps++;
                    break;
                }

            }
        }

        return steps;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章