LeetCode-213-打家劫舍II

文章目录

    • 题目
    • 思想
    • 错误代码
    • 正确思想
    • 正确代码

题目

LeetCode-213-打家劫舍II_第1张图片

思想

  1. 原本自己想的是贪婪,每次都暴力找出当前数组中最大的金额,然后进行偷窃,但是这个想法对于[1,7,9,4]这种存储不起作用,于是不会了。
  2. 想不出别的解法,去抄答案。

错误代码

    public static int rob(int[] nums) {
    	//返回的值
    	int ans=0;
    	//flag记录是否可偷
    	Vector<Integer> flag = new Vector<Integer>();
    	for(int i=0;i<nums.length;i++) {
    		flag.addElement(0);
    	}
		int MaxValue=-1;
		int MaxIndex=0;
    	//找到当前nums中的最大值 且可偷
    	while(flag.contains(0)) {
    		MaxValue=-1;
    		MaxIndex=0;
    		for(int i=0;i<nums.length;i++) {
    			if(nums[i]<0) continue;
    			if(nums[i]>MaxValue && flag.elementAt(i)==0) {
    				MaxValue=nums[i];
    				MaxIndex=i;
    			}
    		}
    		//偷
    		ans+=MaxValue;
    		//把当前位置和左右两边设置为不可偷
    		//把当前位置和左右两边的金额设置为-1
    		flag.set(MaxIndex, 1);
    		nums[MaxIndex]=-1;
    		if(MaxIndex==0) {
    			flag.set(nums.length-1, 1);
    			nums[nums.length-1]=-1;
    		}else {
    			flag.set(MaxIndex-1, 1);
    			nums[MaxIndex-1]=-1;
    		}
    		if(MaxIndex==nums.length-1) {
    			flag.set(0, 1);
    			nums[0]=-1;
    		}else {
    			flag.set(MaxIndex+1, 1);
    			nums[MaxIndex+1]=-1;
    		}
    	}
    	return ans;
    }

正确思想

  1. 即第一家和最后一家必须抢一家,即第0家抢到第n-2家,或者第1家抢到第n-1家,于是有两个值,比较其最大值即可。
  2. 这个想法思路其实完全想到过,但是很快被我否定了,忘记为什么了,反正当时觉得行不通,于是没去尝试。
  3. 动态规划:偷窃前n号房屋的金额为:n-2号房屋的金额+本次 与 n-1号房屋的金额取最大值
    就是说每次只考虑三间房屋,n-2号+n号 和n-1号 哪个的金额大 就偷哪家

正确代码

public class Main {
	public static int RobAct(int[] nums,int start,int end) {
		//前n-2号房屋偷的总额总和
		int first = 0;
		//前n-1号房屋偷的总额
		int second=0;
		int rob=0;
		
		for(int i=start;i<end;i++) {
			//first是前n-2号房屋偷的总额总和,nums[i]是n号房屋 second是前n-1号房屋偷的总额
			rob = Math.max(first+nums[i],second);
			//i向后走了一位 此时前n-2号房屋偷的总额应该是之前n-1号房屋偷的总额 故把second赋给first
			first=second;
			//此时rob应该是实际上前n-1号房屋偷的总和 把它赋给second
			second=rob;
		}
		return rob;
	}
    public static int rob(int[] nums) {
    	int len = nums.length;
    	if(len==1) {
    		return nums[0];
    	}
    	//比较从第0家抢到第n-2家和从第1家抢到第n-1家 取最大值
    	return Math.max(RobAct(nums,0,len-1), RobAct(nums,1,len));
    }
    
	public static void main(String[] args) {
		int[] num= {1,7,9,4,5,6,8,3,2,5,4};
		System.out.print(rob(num));
		return ;
	}
}

你可能感兴趣的:(LeetCode)