LeetCode 31-35 记录

31

https://leetcode.com/problems/next-permutation/

from typing import List

class Solution:
    def nextPermutation(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        if len(nums) == 1:
            return
        if nums[-1] > nums[-2]:
            nums[-1], nums[-2] = nums[-2], nums[-1]
            return
        i = len(nums) - 1
        while nums[i - 1] >= nums[i] and i >= 0:
            i -= 1
        if i == 0:
            nums.sort()
            return
        left = i - 1
        nums[i:] = sorted(nums[i:])
        for j in range(i, len(nums)):
            if nums[j] > nums[left]:
                nums[j], nums[left] = nums[left], nums[j]
                break
        nums[i:] = sorted(nums[i:])

if __name__ == '__main__':
    solu = Solution()
    nums = [1, 2, 3, 4, 5]
    nums = [2, 1, 4, 5, 3]
    nums = [5, 4, 3, 2, 1]
    solu.nextPermutation(nums)
    print(nums)

思路其实是比较简单的,只是一开始想要暴力解决,结果反而误入歧途,不过,也因此重新复习了一下如何生成一个列表的全排列。或许,有时间研究一下 itertool 中的库函数是一个不错的注意。

说回思路,就是判断列表最后两个元素的大小,如果是正序,直接交换两个元素即可,如果不是,则一直往前寻找到第一个打破秩序的数字,然后将这个元素和后面的列表切片中刚好大于这个数字的元素交换,最后,再将后面的部分排个序即可。

32

https://leetcode.com/problems/longest-valid-parentheses/

class Solution:
    def longestValidParentheses(self, s: str) -> int:
        if not s:
            return 0
        res = []
        stack = []
        for i in range(len(s)):
            if stack and s[i] == ')':
                res.append(stack.pop())
                res.append(i)
            if s[i] == '(':
                stack.append(i)
        res.sort()
        ans = 0
        if len(res) <= 1:
            return ans
        ans = 1
        index = 0
        tmp_res = 1
        while index < len(res) - 1:
            if res[index + 1] == res[index] + 1:
                tmp_res += 1
            else:
                tmp_res = 1
                index += 1
                continue
            if tmp_res > ans:
                ans = tmp_res
            index += 1
        return ans

if __name__ == '__main__':
    solu = Solution()
    s = ')(()())'
    Output = solu.longestValidParentheses(s)
    print(Output)

33

https://leetcode.com/problems/search-in-rotated-sorted-array/

from typing import List


class Solution:
    def search(self, nums: List[int], target: int) -> int:
        if not nums:
            return -1
        if len(nums) == 1:
            return 0 if nums[0] == target else -1
        left = 0
        right = len(nums) - 1
        while left < right:
            mid = (left + right) // 2
            if nums[mid] == target:  # 如果中间值等于目标值,直接返回
                return mid
            elif nums[mid] > nums[right]:  # 右边有序
                if nums[left] <= target <= nums[mid]:  # 如果目标值在左边有序的区间内,则右边查找
                    right = mid
                else:  # 否则,左边查找
                    left = mid + 1
            elif nums[mid] < nums[right]:  # 左边有序
                if nums[mid] <= target <= nums[right]:  # 如果目标值在右边有序的区间内,则左边查找
                    left = mid + 1
                else:  # 否则,右边查找
                    right = mid
            else:  # nums[mid] == nums[right]
                right -= 1
        # 如果目标值等于中间值,则返回中间值的下标,否则返回-1
        return left if nums[left] == target else -1


solu = Solution()
print(solu.search([4, 5, 6, 7, 0, 1, 2], 0))  # 4

依然是二分查找,只不过判断条件比普通的二分查找多了一些。

34


LeetCode 31-35 记录
http://fanyfull.github.io/2022/01/03/LeetCode-31-35-记录/
作者
Fany Full
发布于
2022年1月3日
许可协议