20210718动态规划(找规律)List和Map复习

剑指 Offer 14- II. 剪绳子 II

找规律,如果没有直接关系,考虑Math.max求解最大值。

class Solution {
    public int cuttingRope(int n) {

        /*动态规划

        dp[0] = 0; 0
        dp[1] = 0; 0*1
        dp[2] = 1; 1*1
        dp[3] = 2; 1*2
        dp[4] = 4; 2*2
        dp[5] = 6; 2*3
        dp[6] = 9; 3*3
        dp[7] = 12;3*2*2
        dp[8] = 18;3*3*2
        dp[9] = 27;3*3*3
        dp[10]= 36;3*3*2*2
        dp[11]= 54;3*3*3*2

        */
        if(n==0)return 0;
        if(n==1)return 1;
        if(n<4)return n-1;

        if(n==4)return 4;
        if(n==5)return 6;
        int[] dp = new int[n+1];
        dp[0] =0;
        dp[1] = 1;
        dp[2] = 2;
        dp[3] =3;

        for(int i = 4; i <= n; i++) {
            dp[i] = Math.max(dp[i-2] * 2, dp[i-3] * 3);
        }

        return dp[n];

    }
}
剑指 Offer 14- II. 剪绳子 II

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

取余后就不可以用Math.max来比较大小了

1.dp暴力解法(大数情况下失效)

class Solution {
    public int cuttingRope(int n) {

        if(n==0){return 0;}
        if(n<4)return n-1;
        int[] dp = new int[n+1];
        dp[0]=0;
        dp[1] = 1;
        dp[2] = 2;
        dp[3] = 3;
        //dp[4] = 2*2=4
        //dp[5] = 2*3=6
        //dp[6] = 3*3=9
        for(int i = 4;i<=n;i++){
            dp[i] = Math.max(dp[i-2]*2,dp[i-3]*3);
        }

        return dp[n]%1000000007;

    }
}

2.贪心算法

class Solution {
    public int cuttingRope(int n) {
        if(n == 2)
            return 1;
        if(n == 3)
            return 2;
        //这里没有用int
        long res = 1;
        while(n > 4){
            res *= 3;
            res = res % 1000000007;
            n -= 3;
        }
        //强制性转换
        return (int)(res * n % 1000000007);
    }
}

List和Map复习

输入: ["eat", "tea", "tan", "ate", "nat", "bat"],
输出:
[
  ["ate","eat","tea"],
  ["nat","tan"],
  ["bat"]
]

来源:力扣(LeetCode

灵活应用Map的方法是解决问题的关键;


class Solution {
     public List<List<String>> groupAnagrams(String[] strs) {

         List<List<String>> res = new ArrayList<List<String>>();

         Map<String,List<String>> map = new HashMap<>();

         for(String s:strs){
             //String转char数组 toCharArray()
             char[] arr = s.toCharArray();

             Arrays.sort(arr);

             //把arr转成String
             String str = new String(arr);
			
             //判断是否存在键containsKey()
             if(!map.containsKey(str)){

                 List<String> temp = new ArrayList<>();

                 temp.add(s);
                 map.put(str,temp);
             }else{

                 map.get(str).add(s);
             }

             
         }
         //遍历map的方法 key:map.keySet()    map.get(key)
        for(String key:map.keySet()){
            res.add(map.get(key));
        }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值