给你一个整数数组 nums ,你可以对它进行一些操作。
每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除 所有 等于 nums[i] - 1 和 nums[i] + 1 的元素。
开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。
示例 1:
输入:nums = [3,4,2]
输出:6
解释:
删除 4 获得 4 个点数,因此 3 也被删除。
之后,删除 2 获得 2 个点数。总共获得 6 个点数。
示例 2:
输入:nums = [2,2,3,3,3,4]
输出:9
解释:
删除 3 获得 3 个点数,接着要删除两个 2 和 4 。
之后,再次删除 3 获得 3 个点数,再次删除 3 获得 3 个点数。
总共获得 9 个点数。
提示:
1 <= nums.length <= 2 * 104
1 <= nums[i] <= 104
impl Solution {
pub fn delete_and_earn(nums: Vec<i32>) -> i32 {
let mut max = 0;
for num in &nums {
max = if max > *num { max } else { *num }
}
// 固定大小
let mut vec = vec![0; (max + 1) as usize];
for num in nums {
vec[num as usize] += num;
}
Solution::rob2(&vec)
}
pub fn rob2(nums: &Vec<i32>) -> i32 {
if nums.len() <= 0 {
return 0;
} else if nums.len() == 1 {
return nums[0];
}
let mut pre = nums[0];
let mut cur = if nums[1] > nums[0] { nums[1] } else { nums[0] };
let mut i = 2;
while i < nums.len() {
let temp = cur;
cur = if (pre + nums[i]) > cur {
pre + nums[i]
} else {
cur
};
pre = temp;
i = i + 1;
}
cur
}
}