leetcode刷题日记2020-10-02

163 阅读1分钟

x 的平方根

leetcode-cn.com/problems/sq…

思路

采用二分查找的思路: 定义好最小值和最大值区间,在区间中找到中间值,计算中间值的平方与x的大小,并基于大小判断缩短区间窗口或直接找到答案。

代码

class Solution:
    # def mySqrt(self, x: int) -> int:
    def mySqrt(self, x):
        """
        二分查找
        :param x:
        :return:
        """
        def helper(min_value, max_value):
            mid = int((max_value - min_value) / 2) + min_value
            if mid * mid <= x and (mid + 1) * (mid + 1) > x:
                return mid
            elif (mid + 1) * (mid + 1) <= x:
                return helper(mid+1, max_value)
            else:
                return helper(min_value, mid)
        return helper(0, x)

有效的完全平方数

leetcode-cn.com/problems/va…

思路

延续上一题思路,继续二分查找,只是从查找数值改为判断true或者false

代码

        def helper(min_value, max_value):
            mid = int((min_value + max_value) / 2)
            if mid * mid == num:
                return True
            elif mid * mid < num and (mid + 1) * (mid + 1) > num:
                return False
            elif (mid + 1) * (mid + 1) <= num:
                return helper(mid+1, max_value)
            else:
                return helper(min_value, mid)
        return helper(0, num)

最小基因变化

leetcode-cn.com/problems/mi…

思路

  1. BFS搜索
  2. bank做成visit_set来避免回路
  3. 每一次下探过程是修改一个字符

代码

class Solution:
    # def minMutation(self, start: str, end: str, bank: List[str]) -> int:
    def minMutation(self, start, end, bank):
        """
        BFS搜索最短路径
        :param start:
        :param end:
        :param bank:
        :return:
        """
        bank_set = set(bank)
        ch_map = {
            "A": "CGT",
            "C": "AGT",
            "G": "ACT",
            "T": "ACG"
        }
        queue = [(0, start)]
        while len(queue) > 0:
            num, word = queue.pop(0)
            if word == end:
                return num
            for index, ch in enumerate(word):
                for new_ch in ch_map[ch]:
                    new_word = word[:index] + new_ch + word[index+1:]
                    if new_word not in bank_set:
                        continue
                    else:
                        queue.append((num+1, new_word))
                        bank_set.remove(new_word)
        return -1