921. 使括号有效的最少添加:简单贪心思想

简介: 这是 力扣上的 921. 使括号有效的最少添加,难度为 中等。

题目描述

这是 力扣上的 921. 使括号有效的最少添加,难度为 中等

image.png

题目分析

题目描述和题目示例我们知道这又是一个处理括号的题目,一般咱们处理括号类型的题目都会习惯性的使用栈的方式,例如补充缺失的括号等等

一开始看到这个题,我的第一想法也是使用栈,因为栈的先入后出的特性,这就保证了咱们的括号的有序和成对

但是仔细看题目给出的示例,题目只要要求我们使用最少添加括号的方式,来实现本题的要求,那么其实我们只需要检查有多少左括号有右括号就可以知道答案了,但是这里我们需要注意的是,就现成给出的字符串中,左括号一定要在右括号之前,才可以成对,否则就是不能成对的

此处咱们就可以有这样的思路

  • 遍历题目给出的字符串,如果是左括号,就记录下来左括号的数量 leftCnt,如果是右括号的话,咱们就看看 leftCnt 是否大于 0
  • 若是,则说明可以成对,则 leftCnt-1
  • 若不是,则说明,此时的右括号没有现成的匹配的左括号,那么就需要我们主动加上一个左括号, 那么就结果 res +1
  • 遍历完毕之后,咱们就可以检查 结果 res 与 leftCnt 的和,即时本题需要咱们添加最少的括号个数,此处并没有要求我们记录是需要添加左括号还是由括号
  • 如果需要的话,咱们的本次做法也是可以的, leftCnt 表示需要添加的右括号个数,res 表示需要添加左括号的个数

实现方式,同样咱们还是分为 golang 和 C 语言的方式,本次 golang 和 C 的实现没有什么不同:

Golang 的实现方式:

func minAddToMakeValid(s string) (res int) {
    leftCnt := 0
    for _, c := range s {
        if c == '(' {
            leftCnt++
        } else if leftCnt > 0 {
            leftCnt--
        } else {
            res++
        }
    }
    return res + leftCnt
}

C 的实现方式:

int minAddToMakeValid(char * s){
    int res = 0;
    int leftCnt = 0;
    int length = strlen(s);
    for (int i = 0; i < length; i++) {
        char c = s[i];
        if (c == '(') {
            leftCnt++;
        } else if(leftCnt > 0) {
            leftCnt--;
        }else {
                res++;
        }
    }
    res += leftCnt;
    return res;
}

ini

复制代码

int minAddToMakeValid(char * s){    int res = 0;    int leftCnt = 0;    int length = strlen(s);    for (int i = 0; i < length; i++) {        char c = s[i];        if (c == '(') {            leftCnt++;        } else if(leftCnt > 0) {            leftCnt--;        }else {                res++;        }    }    res += leftCnt;    return res;}

这种实现方式,时间复杂度是 O(n),n 就是遍历 s 字符串中字符的个数,空间复杂度是 O(1)

今天就到这里,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

image.png

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~

相关文章
|
7月前
|
存储 算法 数据可视化
LeetCode 131题详解:高效分割回文串的递归与动态规划方法
LeetCode 131题详解:高效分割回文串的递归与动态规划方法
|
算法
基础算法(贪心 合并 位运算)
基础算法(贪心 合并 位运算)
65 0
|
8月前
|
测试技术
【数学】【记忆化搜索 】【动态规划】964. 表示数字的最少运算符
【数学】【记忆化搜索 】【动态规划】964. 表示数字的最少运算符
|
8月前
|
算法
回溯算法思想
回溯算法思想
48 0
|
机器学习/深度学习 算法 Python
Python实现回溯算法求解括号生成
Python实现回溯算法求解括号生成
67 0
|
存储 算法
LeetCode:77. 组合——回溯法,是暴力法?
题目描述:给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。
|
机器学习/深度学习 算法 中间件
一文学会排列组合解法
一文学会排列组合解法