LeetCode

LeetCode收纳箱

慢慢整理吧好乱好乱

剪绳子乘积最大

public class Solution {
    public int cutRope(int target) {
    //几种方法:
    //1. 递归:第一(i)剪最大值f(n)=max(f(i)*f(n-i))//重复计算
    //2.动态规划DP;反向递归,从下往上,从f(i),f(2)往上推
    //3.贪婪(总结规律):
     /*4 : 2*2
     * 5 : 2*3
     * 6 : 3*3
     * 7 : 2*2*3 或者4*3
     * 8 : 2*3*3
     * 9 : 3*3*3
     * 10:2*2*3*3 或者4*3*3
     * 11:2*3*3*3
     * 12:3*3*3*3
     * 13:2*2*3*3*3 或者4*3*3*3
     1)最小元素是2和3,4是<2*2,5是<2*3,再往上肯定要再细分成2和3的组合
     2)首先尽可能的多留3(3>2*1)【】,并且要至少留出来一个3(只是我个人分析需要没算法并不需要)再细分要不要再拆分
     3)转折点是4和5:对3求雨,每个数都能保证包含(大于)一个3:
         若余数是0,当然全部是3;
         若余数是1,那么此时就要比较3+1<2*2(4),就要把这个3 和余数1变成2*2,即有2个2;
         若余数是2,此时是3*2>2*2*1(5),那么保留一个2
     */
        if(target == 2)
            return 1;
        if(target == 3)
            return 2;
        
        int three = target / 3;
        int two = target % 3;
        if(two == 0)
            return (int)Math.pow(3,three);
        if(two == 1)
            return (int)Math.pow(3,three-1)*2*2;
        else
            return (int)Math.pow(3,three)*2;
        

    }
}

4. 两个排序数组的中位数

  要求复杂度O(log(M+N))

class Solution {
    public double findMedianSortedArrays(int[] A, int[] B) {
        //复杂度log(m+n)
        //依次将两数组切割成左右两半,每半个数可以有0~len个数,并混合成大的两半
        //需要满足条件:max(left)< min(right)
        //当左边小时,就增加i;左边大就减小i(折半变化)
        int m = A.length;
        int n = B.length;
        if (m > n) { // to ensure m<=n以防j为负数
            int[] temp = A; A = B; B = temp;
            int tmp = m; m = n; n = tmp;
        }
        int iMin = 0, iMax = m, halfLen = (m + n + 1) / 2;
        while (iMin <= iMax) {
            int i = (iMin + iMax) / 2;
            int j = halfLen - i; //保证混合后的两边数量都为整体的一半
            if (i < iMax && B[j-1] > A[i]){
                iMin = i + 1; // i is too small
            }
            else if (i > iMin && A[i-1] > B[j]) {
                iMax = i - 1; // i is too big
            }
            else { // i is perfect
                int maxLeft = 0;
                if (i == 0) { maxLeft = B[j-1]; }
                else if (j == 0) { maxLeft = A[i-1]; }
                else { maxLeft = Math.max(A[i-1], B[j-1]); }
                if ( (m + n) % 2 == 1 ) { return maxLeft; }

                int minRight = 0;
                if (i == m) { minRight = B[j]; }
                else if (j == n) { minRight = A[i]; }
                else { minRight = Math.min(B[j], A[i]); }

                return (maxLeft + minRight) / 2.0;
            }
        }
        return 0.0;
    }
}

29.两数相除

  给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值