[1. House on the street, happy thief No. 1]
198. House raiding (medium)
You are a professional thief who plans to steal houses along the street. There is a certain amount of cash hidden in each room. The only restrictive factor affecting your theft is that the adjacent houses are equipped with interconnected anti-theft systems. If two adjacent houses are intruded by thieves on the same night, the system will automatically alarm.
Given a non negative integer array representing the amount stored in each house, calculate the maximum amount you can steal overnight without touching the alarm device.
Example 1:
Input: [1,2,3,1]
Output: 4
Explanation: steal house 1 (amount = 1) and then steal house 3 (amount = 3).
Maximum amount stolen = 1 + 3 = 4.
Example 2:
Input: [2,7,9,3,1]
Output: 12
Explanation: steal house 1 (amount = 2), steal house 3 (amount = 9), and then steal house 5 (amount = 1).
Maximum amount stolen = 2 + 9 + 1 = 12.
Tips:
1 <= nums.length <= 100
0 <= nums[i] <= 400
/* * Every house has two choices, one is to steal, the other is not to steal * 1,If you steal house i, because you can't steal adjacent houses, the maximum amount of money that the scheme can steal is the maximum amount of stealing house i-2 + the money of house i * 2,If you don't steal house i, it means that the amount is the maximum amount of stealing house i-1 * Therefore, the state transition equation can be obtained: DP [i] = math max(dp[i-1], dp[i-2] + nums[i]) */
public static int rob(int[] nums) { int len = nums.length; if( nums.length == 0 ) return 0; else if( nums.length == 1 ) return nums[0]; else if( nums.length == 2 ) return Math.max(nums[0], nums[1]); int[] dp = new int[len]; // Maximum amount that can be stolen when saving to house i /* initialization */ dp[0] = nums[0]; // Only one room dp[1] = Math.max(nums[0], nums[1]); // Take the one with the largest amount among the two for( int i = 2; i < len; i++) { dp[i] = Math.max(dp[i-1], dp[i-2] + nums[i]); } return dp[len-1]; }
Note: LeetCode There is another way to save space by scrolling arrays in the solution, which is attached here
public static int rob(int[] nums) { int len = nums.length; if( nums.length == 0 ) return 0; else if( nums.length == 1 ) return nums[0]; else if( nums.length == 2 ) return Math.max(nums[0], nums[1]); /* initialization */ int first = nums[0]; int second = Math.max(nums[0], nums[1]); for( int i = 2; i < len; i++) { int t = second; second = Math.max(first + nums[i], second); first = t; } return second; }
[2. The house under the ring, happy thief No. 2]
213. House raiding II (medium)
You are a professional thief. You plan to steal houses along the street. There is a certain amount of cash in each room. All the houses in this place are in a circle, which means that the first house and the last house are next to each other. At the same time, adjacent houses are equipped with interconnected anti-theft systems. If two adjacent houses are intruded by thieves on the same night, the system will automatically alarm.
Given a non negative integer array representing the amount stored in each house, calculate the maximum amount you can steal tonight without touching the alarm device.
Example 1:
Input: num = [2,3,2]
Output: 3
Explanation: you can't steal house 1 (amount = 2) and then house 3 (amount = 2) because they are adjacent.
Example 2:
Input: num = [1,2,3,1]
Output: 4
Explanation: you can steal house 1 (amount = 1) and then house 3 (amount = 3).
Maximum amount stolen = 1 + 3 = 4.
Example 3:
Input: num = [0]
Output: 0
Tips:
1 <= nums.length <= 100
0 <= nums[i] <= 1000
/* * Put the state transition equation first: DP [i] = math max(dp[i-1], dp[i-2] + nums[i]) * Because the ring is formed, it is discussed in two cases: * 1,If you steal house 1, you cannot steal house nums length * 2,Stealing houses nums Length, you cannot steal house 1 */
public static int rob(int[] nums) { int len = nums.length; if( nums.length == 0 ) return 0; else if( nums.length == 1 ) return nums[0]; else if( nums.length == 2 ) return Math.max(nums[0], nums[1]); /* * Because the ring is formed, it is discussed in two cases: * 1,If you steal house 1, you cannot steal house nums length * 2,Stealing houses nums Length, you cannot steal house 1 */ return Math.max(Rob(nums, 0, nums.length - 1), Rob(nums, 1, nums.length)); } public static int Rob(int[] nums, int start, int end) { int first = nums[start]; int second = Math.max(nums[start], nums[start + 1]); for( int i = start + 2; i < end; i++) { int t = second; second = Math.max(first + nums[i], second); first = t; } return second; }
[3. I would like to call the thief the strongest house growing on a tree!]
337. House raiding III (medium)
After robbing a street and a circle of houses last time, the thief found a new area that could be stolen. This area has only one entrance, which we call "root". In addition to the "root", each house has and only has a "father" house connected to it. After some reconnaissance, the smart thief realized that "the arrangement of all houses in this place is similar to a binary tree". If two directly connected houses are robbed on the same night, the house will automatically call the police.
Calculate the maximum amount a thief can steal in a night without triggering the alarm.
Example 1:
Input: [3,2,3,null,3,null,1]
Output: 7
Explanation: the maximum amount a thief can steal in one night = 3 + 3 + 1 = 7
Example 2:
Input: [3,4,5,1,3,null,1]
Output: 9
Explanation: the maximum amount a thief can steal in one night = 4 + 5 = 9
Pass times 101306 submit times 164891
/* * [It is similar to the first two, but the road stolen this time has become two] * Now the thief's father (root) has two children (leaves), one called 'left' and the other called 'right'. The two children steal from left and right respectively * The maximum amount is the maximum amount stolen from the total amount of the thief's father and two children * But note: if the thief's father steals the money, both children can't steal it, otherwise they will be found; On the contrary, the thief's father can't steal * * The general description is as follows: * Thief father does not steal: the maximum amount that can be stolen in the current node = 'left' child can steal the maximum amount + 'right' child can steal the maximum amount * The thief's father stole: the maximum amount that the current node can steal = 'left' the money that the child can get when he doesn't steal + 'right' the money that the child can get when he doesn't steal + the money of the current house * * State transition equation: [0: amount when not stealing, 1: amount after stealing] * result[0] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]); * result[1] = left[0] + right[0] + root.val */
public static int rob(TreeNode root) { int[] result = Rob(root); return Math.max(result[0], result[1]); } public static int[] Rob(TreeNode root) { if( root == null ) return new int[] {0,0}; int[] result = new int[2]; int[] left = Rob(root.left); int[] right = Rob(root.right); result[0] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]); result[1] = left[0] + right[0] + root.val; return result; }
[4. Could this be home robbing iv]
740. Delete and gain points (medium)
Give you an integer array nums, you can do some operations on it.
In each operation, select any num [i], delete it and obtain the number of num [i]. After that, you must delete each element equal to nums[i] - 1 or nums[i] + 1.
You have 0 points at the beginning. Returns the maximum number of points you can get through these operations.
Example 1:
Input: num = [3,4,2]
Output: 6
Explanation:
Delete 4 to get 4 points, so 3 is also deleted.
After that, delete 2 and get 2 points. Get a total of 6 points.
Example 2:
Input: num = [2,2,3,3,3,4]
Output: 9
Explanation:
Delete 3 to get 3 points, and then delete two 2 and 4.
After that, delete 3 again to obtain 3 points, and delete 3 again to obtain 3 points.
Get a total of 9 points.
Tips:
1 <= nums.length <= 2 * 104
1 <= nums[i] <= 104
/* * It may be a little strange how this thing has something to do with house raiding * Note that when x is selected, neither x-1 nor x+1 can be selected. In order to get as many points as possible, x you should select all * Therefore: * We assume that the array given by the title is: * nums = [2,2,3,3,3,4] * * Then after causing [house robbery]: * houses = [0,0,2,3,1] * * Does it smell like that! * Let's first paste the state transition equation of [home robbing]: * dp[i] = Math.max(dp[i-1], dp[i-2] + nums[i]) * The state transition equation of this topic is given: * dp[i] = Math.max(dp[i - 1], dp[i - 2] + i * houses[i]); * Note: i * houses[i] represents the money of the house * * After stealing houses on the streets, rings and trees, it seems that this is another perfect theft */
public static int deleteAndEarn(int[] nums) { if( nums.length == 0 ) return 0; else if( nums.length == 1) return nums[0]; int max = 0; for( int i = 0; i < nums.length; i++) { // Get the largest house number in order to construct [house robbery] max = Math.max(max, nums[i]); } int[] houses = new int[max + 1]; for( int i = 0; i < nums.length; i++) { houses[nums[i]] ++; } return rob(houses, max); } public static int rob(int[] nums, int max) { int len = nums.length; int[] dp = new int[max + 1]; dp[0] = nums[0]; dp[1] = Math.max(nums[0], nums[1]); for( int i = 2; i < len; i++) { dp[i] = Math.max(dp[i-1], dp[i-2] + i * nums[i]); } return dp[max]; }
Method of attaching a scrolling array
public static int deleteAndEarn(int[] nums) { if( nums.length == 0 ) return 0; else if( nums.length == 1) return nums[0]; int max = 0; for( int i = 0; i < nums.length; i++) { // Get the largest house number in order to construct [house robbery] max = Math.max(max, nums[i]); } int[] houses = new int[max + 1]; for( int i = 0; i < nums.length; i++) { houses[nums[i]] ++; } return rob(houses); } public static int rob(int[] nums) { int len = nums.length; int first = nums[0]; int second = Math.max(nums[0], nums[1]); for( int i = 2; i < len; i++) { int t = second; second = Math.max(first + i * nums[i], second); first = t; } return second; }
[if the talented thief has a better place to steal, he will continue to update it]