买钢笔和铅笔的方案数
题目
2240. 买钢笔和铅笔的方案数 - 力扣(LeetCode)
思路
直接模拟会时间超限,根据公式进行优化
代码
优化前
java
public long waysToBuyPensPencils(int total, int cost1, int cost2) {
long sum = 0;
while(total>=0){
long ans = fun(total,Math.min(cost1,cost2),0);
sum = sum + ans;
total = total - Math.max(cost1,cost2);
System.out.println(sum);
}
return sum;
}
private long fun(int total,int cost,int sum){
sum++;
if(total>=cost){
return fun(total-cost,cost,sum);
}
return sum;
}
优化后
java
public long waysToBuyPensPencils(int total, int cost1, int cost2) {
long n = (total/cost1)+1 , res = n;
for(long i=0;i<n;i++){
res = res + (total- cost1 *i)/cost2;
}
return res;
}
字符串中最大的三位相同数
题目
2264. 字符串中最大的 3 位相同数字 - 力扣(LeetCode)
思路
我的思路是直接遍历,找出所有的三位相同数字,然后找出其中最大的。
看了别人的题解之后我发现,我简直思路太狭隘了,往往最朴素的方法最好用
代码
优化前:
java
public String largestGoodInteger(String num) {
char[] charArray = num.toCharArray();
List<String> list = new ArrayList<>();
for(int i=0;i<charArray.length;i++){
if((i+3<charArray.length)&&charArray[i]==charArray[i+1]&&charArray[i+1]==charArray[i+2]){
StringBuilder sb = new StringBuilder(charArray[i]);
sb.append(charArray[i+1]);
sb.append(charArray[i+2]);
list.add(sb.toString());
}
}
if(list.size()==0){
return "";
}
String strLine = list.get(0);
for(String str:list){
if(str.compareTo(strLine)>0){
strLine=str;
}
}
return strLine;
}
优化后:
java
public String largestGoodInteger(String num) {
String[] e = {"000","111","222","333","444","555","666","777","888","999"};
for(int i = 9; i >= 0; i--){
if(num.indexOf(e[i]) >= 0){return e[i];}
}
return "";
}
找出输掉零场或者一场比赛的玩家
题目
2225. 找出输掉零场或一场比赛的玩家 - 力扣(LeetCode)
思路
set集合记录所有人,用哈希表记录所有的败者以及失败次数
遍历set集合判断是否失败过,或者失败次数为1,添加进对应的集合
最后才排序
代码
java
public List<List<Integer>> findWinners(int[][] matches) {
Map<Integer, Integer> answer2 = new HashMap<>();
Set<Integer> answer = new TreeSet<>();
for (int[] mt : matches) {
answer.add(mt[0]);
answer.add(mt[1]);
answer2.put(mt[1], answer2.getOrDefault(mt[1], 0) + 1);
}
List<Integer> a1 = new ArrayList<>();
List<Integer> a2 = new ArrayList<>();
for (Integer a : answer) {
if (answer2.getOrDefault(a, 0) == 1) {
a2.add(a);
} else if (answer2.getOrDefault(a, 0) == 0) {
a1.add(a);
}
}
List<List<Integer>> result = new ArrayList<>();
result.add(a1);
result.add(a2);
return result;
}
拓展
这里正好讲一下HashSet,LinkedHashSet和TreeSet
详见:HashSet、LinkedHashSet 和 TreeSet-CSDN博客
- HashSet:HashSet可以保证唯一性,但是不能保证有序
- LinkedHashSet:既可以保证不重复,又能保持元素插入时的顺序。
- TreeSet :基于红黑树,能够自动对元素进行排序,并保证元素的唯一性。因此,使用
TreeSet
可以确保集合中的元素从小到大排序,同时每个元素都是唯一的。