第一题 无效的括号

题目

解题思路

显然,要使所有的括号匹配,最容易想到的办法就是栈
每读到一个左括号,便将其入栈,每读到一个右括号,便将其出栈
如果读完字符串之后栈内仍有元素,阐明有多余的左括号
如果读到右括号时栈为空,阐明有多余的右括号

代码

func isValid(s string) bool {    n := len(s)    //如果是奇数,能够间接断定字符串是错的    if n % 2 == 1 {        return false    }    //字符串的匹配    pairs := map[byte]byte{        ')': '(',        ']': '[',        '}': '{',    }    stack := []byte{}    for i := 0; i < n; i++ {        if pairs[s[i]] > 0 {            if len(stack) == 0 || stack[len(stack)-1] != pairs[s[i]] {                return false            }            //出栈            stack = stack[:len(stack)-1]        } else {            //出栈            stack = append(stack, s[i])        }    }    return len(stack) == 0}

复杂度剖析

工夫复杂度:O(n),其中 n 是字符串 s 的长度。

空间复杂度:O(n+∣∣),其中 示意字符集,本题中字符串只蕴含 6 种括号,∣∣=6。栈中的字符数量为 O(n),而哈希表应用的空间为 O(∣∣),相加即可失去总空间复杂度。

第二题 缺失数字

题目

解题思路

思考题目标线索
咱们能够发现,除了缺失的这个数,其余的数都是间断的
如果咱们能将这个数组排序,就能直观的搜寻到缺失的数

代码

func missingNumber(nums []int) int {    sort.Ints(nums)    for i:=0;i<len(nums);i++{        if nums[i]!=i {            return nums[i]-1        }    }    return len(nums)}

range循环

func missingNumber(nums []int) int {    sort.Ints(nums)    for i, num := range nums {        if num != i {            return i        }    }    return len(nums)}作者:LeetCode-Solution链接:https://leetcode-cn.com/problems/missing-number/solution/diu-shi-de-shu-zi-by-leetcode-solution-naow/起源:力扣(LeetCode)著作权归作者所有。商业转载请分割作者取得受权,非商业转载请注明出处。

复杂度剖析


显然
在工夫复杂度上仍有很大的优化空间

工夫复杂度:O(nlogn),其中 n 是数组 nums 的长度。排序的工夫复杂度是 O(nlogn),遍历数组寻找失落的数字的工夫复杂度是 O(n),因而总工夫复杂度是 O(nlogn)。

空间复杂度:O(logn),其中 n 是数组 nums 的长度。空间复杂度次要取决于排序的递归调用栈空间。

更优良的解法


这样咱们就将其转化为之前曾经解决过的简略问题
详见
https://segmentfault.com/a/11...