Leetcode每日随机2021/4/29
发布日期:2021-05-07 13:50:01 浏览次数:11 分类:精选文章

本文共 2473 字,大约阅读时间需要 8 分钟。

我最近在做LeetCode上的题目,遇到了几个挺有意思的问题。今天我想记录一下我的思考过程和解决方案,希望能对其他人有所帮助。

问题134 - 可以完成环游吗?

这个问题是说,给定一辆车的油量和加油站的油价,判断是否可以完成一圈环游。我的理解是,车子在加油站加油后,油量足够到下一个加油站吗?如果可以,就返回当前加油站的索引,否则返回-1。

我觉得这个问题可以通过模拟油量来判断。首先,我需要确保每个加油站的油量足够支持到下一个加油站。如果有任何一个加油站不够,就跳过,继续看下一个。如果所有加油站都能支持,就返回当前加油站的索引。

这个问题需要模拟油量的消耗。对于每个加油站,我需要计算剩余的油量,看看是否可以支持到下一个加油站。如果某个加油站不够,就直接跳过。最终如果所有加油站都能支持,就返回当前加油站的索引,否则返回-1。

代码

public int canCompleteCircuit(int[] gas, int[] cost) {    for (int i = 0; i < cost.length; i++) {        if (cost[i] > gas[i]) {            continue;        }        int gasLeft = gas[i] - cost[i];        int j = (i + 1) % cost.length;        while (j != i) {            if (cost[j] > gas[j] + gasLeft) {                break;            }            gasLeft += gas[j] - cost[j];            j = (j + 1) % cost.length;        }        if (j == i) {            return i;        }    }    return -1;}

问题914 - 是否有特定大小的组

这个问题是说,给定一副牌,判断是否存在一个特定的组数。例如,是否存在一个组数x,使得每个x的出现次数都是x的倍数。

我觉得这个问题可以通过统计每个数字的出现次数,然后计算这些次数的最大公约数来解决。如果最大公约数大于1,就说明存在这样的x,否则不存在。

首先统计每个数字的出现次数。然后计算这些次数的最大公约数。如果最大公约数大于1,就返回true,否则返回false。

代码

public boolean hasGroupsSizeX(int[] deck) {    Map
count = new HashMap<>(); Arrays.stream(deck).forEach(a -> count.put(a, count.getOrDefault(a, 0) + 1)); int divisor = count.get(deck[0]); for (int i : count.keySet()) { divisor = gcd(divisor, count.get(i)); if (divisor == 1) { return false; } } return true;}private int gcd(int a, int b) { int temp; while (b > 0) { temp = a % b; a = b; b = temp; } return a;}

问题1249 - 最小的删除量使括号有效

这个问题是说,给定一个字符串,删除最少的字符,使得括号是有效的。比如"()()"可以直接用,但"())("就需要删除一个括号。

我觉得可以用栈来解决这个问题。遍历字符串,遇到'('就压入栈,遇到')'就弹出栈。如果栈空了就删除当前的')',否则弹出栈。最后检查栈是否为空。

用栈来记录括号的匹配情况。遇到'('压入栈,遇到')'就弹出栈。如果栈为空了,就删除当前的')',否则弹出栈。最后检查栈是否为空,如果不为空,就需要删除栈中所有的'('。

代码

public String minRemoveToMakeValid(String s) {    StringBuilder sb = new StringBuilder(s);    Stack
stack = new Stack<>(); for (int i = 0; i < sb.length(); i++) { if (sb.charAt(i) == '(') { stack.push('('); } else if (sb.charAt(i) == ')') { if (stack.isEmpty()) { sb.deleteCharAt(i); i--; } else { stack.pop(); } } } int size = stack.size(); while (size > 0) { sb.deleteCharAt(sb.lastIndexOf("(")); size--; } return sb.toString();}

通过这些问题的练习,我对算法有了更深的理解,也学会了如何用不同的方法解决问题。希望这些代码和思考过程能对你有所帮助!

上一篇:Leetcode每日随机2021/4/30
下一篇:Leetcode每日随机2021/4/28

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月05日 02时25分27秒