public class Solution4 {
// 时间复杂度不符合
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int m = nums1.length;
int n = nums2.length;
int len = m+n;
int left = 0;
int right = 0;
int nums1Start = 0,nums2Start = 0;
for(int i = 0;i<=len/2;i++){
left = right;
if(nums1Start<m && (nums2Start>=n || nums1[nums1Start]<nums2[nums2Start])){
right = nums1[nums1Start++];
}else {
right = nums2[nums2Start++];
}
}
if((len &1) == 0){
return (left+right)/2.0;
}
return right;
}
}
时间复杂度要求O(log(n+m)) 感觉是二分但是不会写,目前写的是寻找一半数据进行找到中位数,主要判断条件为if(nums1Start<m && (nums2Start>=n || nums1[nums1Start]<nums2[nums2Start])),看是否越界,然后把小的数组中的指针往后面移动,if((len &1) == 0)判断最低位是否为1。
public class Solution322 {
static int [] dp ;
public int coinChange(int[] coins, int amount) {
dp = new int[amount+1];
Arrays.fill(dp, -2);
dp[0] = 0;
return minChan(coins,amount);
}
private int minChan(int[] coins, int amount){
if(amount < 0){
return -1;
}
if(dp[amount]!=-2){
return dp[amount];
}
// 没有优化 没有结果的话也会保存 应该没结果continue;
// for(int coin :coins){
// dp[amount] =minChan(coins,amount-coin)+1;
// }
int res = Integer.MAX_VALUE;
for(int coin :coins){
int sub = minChan(coins,amount-coin);
if(sub < 0){
continue;
}
res =Math.min(sub+1 ,res);
}
dp[amount] = res==Integer.MAX_VALUE? -1:res;
return dp[amount];
}
}
采用备忘录进行优化,初始化为一个不需要的数字,如果不是初始化的数字则证明已经计算过可以返回,如果为-1则表示无解,用res保存结果中的最小值然后存入备忘录,最开始直接存到备忘录中,导致有负数,结果不正确,应该进行判断,无解直接跳出循环。