//打家劫舍,经典的动态分析 一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响小偷偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组 nums ,请计算 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
public class Text12 {
public static void main(String[] args) {
int[] nums ={2,7,9,3,1};
System.out.println(rob(nums));
}
public static int rob(int[] nums) {
int cur=0,pre=0,temp;
for(int num:nums)
{
temp=cur;
cur = Math.max(cur,num+pre);
pre=temp;
}
return cur;
}
}
合并两个有序数组
public class Text9 {
public static void main(String[] args) {
int[] a = {1, 2, 3, 4, 5, 6};
int[] b = {2, 3, 6, 648};
int m = a.length;
int n = b.length;
merge(a, m, b, n);
}
private static void merge(int[] nums1, int m, int[] nums2, int n) {
//暴力解法
// int num[] = new int[m + n];
// for (int i = 0; i < m; i++) {
// num[i] = nums1[i];
// }
// for (int i = 0; i < n; i++) {
// num[m + i] = nums2[i];
// }
// Arrays.sort(num);
// for (int i : num) {
// System.out.print(i+" ");
// }
//逆向双指针
//逆向双指针
int count =m+n-1;
m--;n--;
while(m>=0 && n>=0)
{
if(nums1[m]>nums2[n])
{
nums1[count--] = nums1[m--];
}else{
nums1[count--] = nums2[n--];
}
}
while(n>=0)
{
nums1[count--] = nums2[n];
}
while(m>=0)
{
nums1[count--] = nums1[m];
}
}
}