算法学习 | day30/60 柠檬水找零/根据身高重建队列/用最少数量的箭引爆气球

一、题目打卡

        1.1 柠檬水找零

        题目链接:. - 力扣(LeetCode)

class Solution {
public:
    bool lemonadeChange(vector<int>& bills) {
        // int rest = 0;
        unordered_map<int,int> rest;
        for(auto &it : bills){
            int tmp = it - 5;
            rest[it]++;
            while(tmp / 20 && rest[20] != 0){
                tmp -= 20;
                rest[20]--;
            }
            while(tmp / 10 && rest[10] != 0){
                tmp -= 10;
                rest[10]--;
            }
            while(tmp / 5 && rest[5] != 0){
                tmp -= 5;
                rest[5]--;
            }
            if(tmp > 0) return false;
            // int tmp = it - 5; // 找零的钱
            // rest += it;
            // rest -= tmp;
            // if(rest < 0) return false;
        }
        return true;
    }
};

        模拟收银台的方式进行找零,这样不过多浪费了一些空间,但是思路还是很清楚的,从最大的向最小的开始找零。

        1.2 根据身高重建队列

        题目链接:. - 力扣(LeetCode)​​​​​​​

class Solution {
public:
    static bool myCompare(const vector<int>& v1, const vector<int>& v2) {
        if(v1[0] == v2[0]) return v1[1] < v2[1];
        return v1[0] > v2[0];
    }
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        sort(people.begin(), people.end(), myCompare);
        // for (auto &i : people) {
        //     cout << i[0] << " " << i[1] << endl;
        // }
        vector<vector<int>> res;
        for(auto &i : people){
            res.insert(res.begin() + i[1], i);
        }
        return res;
    }
};

        题目和分发糖果的思路很相似,都是固定一个条件去考虑另一个条件,这里先根据身高对整个队列进行排序,然后比较巧妙的思路是排序后的队列,只需要根据当前值的索引1就是需要插入到最后的位置,这里有个小的细节是,写谓词的时候,注意写在 class 里的话,需要前面加 static,另一个就是谓词的处理逻辑,需要加上一个身高相等情况下索引2升序排列的情况,否则最后答案会出现错误。

        1.3 用最少数量的箭引爆气球

        题目链接:. - 力扣(LeetCode)

class Solution {
public:
    static bool cmp(vector<int>& v1, vector<int>& v2){
        if(v1[0] == v2[0]) return v1[1] < v2[1];
        return v1[0] < v2[0];
    }
    int findMinArrowShots(vector<vector<int>>& points) {
        sort(points.begin(),points.end(),cmp);
        // for (auto &i : points) {
        //     cout << i[0] << " " << i[1] << endl;
        // }
        // int res = 0;
        // for(int i = 0; i < points.size();i++){
        //     res++;
        //     int tmp = points[i][1];
        //     while(i < points.size() - 1 && tmp >= points[i + 1][0]){
        //         i++;
        //     }
        // }


        int res = 1;
        vector<int> tmp{INT_MIN,INT_MAX};
        for(int i = 0 ; i < points.size() ; i++){
            if(tmp[1] < points[i][0]){
                res++;
                tmp = {INT_MIN,INT_MAX};
            }
            tmp[0] = max(points[i][0], tmp[0]);
            tmp[1] = min(points[i][1], tmp[1]);
        }
        return res;
    }
};

        考察的是重叠区间的处理,处理时的思路是对左端点进行排序,然后动态维护一个坐标,这个左边是实时进行更新的,当发现如果循环过程中的某个左索引超过了维护数组的右索引,那么就说明一根箭已经无法穿过了,这时候就需要重置坐标,并把最后返回箭的数目加1。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用正则表达式来解析日期字符串"2023/5/30"。以下是一个示例代码: ```java import java.time.LocalDate; import java.util.regex.Matcher; import java.util.regex.Pattern; public class DateParser { private static final Pattern PATTERN = Pattern.compile("(\\d{4})/(\\d{1,2})/(\\d{1,2})"); public static LocalDate parse(String dateString) { Matcher matcher = PATTERN.matcher(dateString); if (matcher.matches()) { int year = Integer.parseInt(matcher.group(1)); int month = Integer.parseInt(matcher.group(2)); int day = Integer.parseInt(matcher.group(3)); return LocalDate.of(year, month, day); } else { throw new IllegalArgumentException("Invalid date format: " + dateString); } } } ``` 在这个示例中,我们使用`java.util.regex.Pattern`类来创建一个正则表达式模式对象,该对象指定了日期格式为"yyyy/M/d",其中"\\d{4}"表示4位数的年份,"\\d{1,2}"表示1位或2位数的月份和日期,"()"是用来捕获匹配的子字符串。 然后我们调用`Pattern.matcher()`方法来创建一个用于匹配输入字符串的`java.util.regex.Matcher`对象,并使用`Matcher.matches()`方法来检查输入字符串是否与正则表达式匹配。 如果匹配成功,则使用`Matcher.group()`方法获取每个捕获组的值,并使用`LocalDate.of()`方法创建一个`LocalDate`对象,该对象表示解析后的日期。 如果匹配失败,则抛出一个`IllegalArgumentException`异常。 您可以使用以下代码来解析"2023/5/30": ```java LocalDate date = DateParser.parse("2023/5/30"); System.out.println(date); // 输出:2023-05-30 ``` 请注意,以上代码假设输入的日期字符串是有效的,并且符合指定的日期格式。如果输入的日期字符串不符合指定的日期格式,将会抛出`IllegalArgumentException`异常。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值