剑指 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;
}
}