力扣随机题

买钢笔和铅笔的方案数

题目

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博客

  1. HashSet:HashSet可以保证唯一性,但是不能保证有序
  2. LinkedHashSet:既可以保证不重复,又能保持元素插入时的顺序。
  3. TreeSet :基于红黑树,能够自动对元素进行排序,并保证元素的唯一性。因此,使用 TreeSet 可以确保集合中的元素从小到大排序,同时每个元素都是唯一的。
相关推荐
风筝在晴天搁浅1 分钟前
字节高频题 小于n的最大数
算法
LabVIEW开发3 分钟前
LabVIEW水力机组空蚀在线监测
算法·labview·labview知识·labview功能·labview程序
AI科技星9 分钟前
科幻艺术书本封面:《全域数学》第一部·数术本源 第三卷 代数原本(P95-141)完整五级目录【乖乖数学】
算法·机器学习·数学建模·数据挖掘·量子计算
风筝在晴天搁浅11 分钟前
LeetCode 92.反转链表Ⅱ
算法·leetcode·链表
王老师青少年编程24 分钟前
csp信奥赛C++高频考点专项训练之贪心算法 --【贪心与二分判定】:数列分段 Section II
c++·算法·贪心·csp·信奥赛·二分判定·数列分段 section ii
V搜xhliang02461 小时前
OpenClaw科研全场景用法:从文献到实验室的完整自动化方案
运维·开发语言·人工智能·python·算法·microsoft·自动化
汉克老师1 小时前
GESP2025年3月认证C++五级( 第三部分编程题(2、原根判断))
c++·算法·模运算·gesp5级·gesp五级·原根·分解质因数
数据皮皮侠1 小时前
上市公司创新韧性数据(2000-2024)|顶刊同款 EIR 指数
大数据·人工智能·算法·智慧城市·制造
WL_Aurora1 小时前
Python 算法基础篇之链表
python·算法·链表
科研前沿2 小时前
纯视觉无感解算 + 动态数字孪生:室内外无感定位技术全新升级
大数据·人工智能·算法·重构·空间计算