Leetcode刷题记录 day2 编程入门题

本文介绍了四个编程问题的解题思路和Python代码实现,包括二维矩阵转置、字符串按元音得分分割、统计元音字符串数量以及在山脉数组中找到峰顶索引,所有方法都强调了高效的算法设计,如矩阵转置的O(n)时间和字符串处理的O(n)时间复杂度。
摘要由CSDN通过智能技术生成

1.转置矩阵

给你一个二维整数数组 matrix, 返回 matrix 的 转置矩阵 。

矩阵的 转置 是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引。

解题思路

第一个想法就是直接获取到矩阵各个元素的行索引和列索引,直接进行交换就行了,但是不太会直接在原矩阵上操作,于是又新建了个列表直接将原矩阵的行作为列,列作为行,并使用原矩阵中的元素赋值

代码实现

class Solution:
    def transpose(self, matrix: List[List[int]]) -> List[List[int]]:
        re_matrix = []
        for row in range(len(matrix[0][:])):
            row_temp = []
            for col in range(len(matrix)):
                row_temp.append(matrix[col][row])
                re_matrix.append(row_temp)
        return re_matrix

看了眼官方题解,思路是一样的,不过可以使用原矩阵的形状对转换后的数组初始化,可以省一个临时变量的空间

class Solution:
    def transpose(self, matrix: List[List[int]]) -> List[List[int]]:
        re_matrix = [[0] * len(matrix) for _ in le(matrix[0])]
        for row in range(len(matrix[0])):
            for col in range(len(matrix)):
                re_matrix[row][col] == matrix[col][row]
        return re_matrix

复杂度分析

时间复杂度O(n)(n为矩阵元素个数),空间复杂度O(1)

2.分割字符串的最大得分

给你一个由若干 0 和 1 组成的字符串 s ,请你计算并返回将该字符串分割成两个 非空 子字符串(即  子字符串和  子字符串)所能获得的最大得分。

「分割字符串的得分」为  子字符串中 0 的数量加上  子字符串中 1 的数量。

解题思路

顺着题意容易想到遍历整个字符串将每种组合的得分都算出来,然后得出最大的得分,但是这种方法时间复杂度达到了O(n2)。换种思路,当我们从右子字符串中移除字符,并添加到左子字符串中时,我们只需要知道变化的字符是“0”还是“1”,便可以知道整体得分的变化,而这种方法只需要遍历两次字符串

代码实现

第一种

def maxScore(self, s: str) -> int:
        return max(s[:i].count('0') + s[i:].count('1') for i in range(1, len(s)))

第二种

class Solution:
    def maxScore(self, s: str) -> int:
        ans = score = (s[0] == '0') + s[1:].count('1')
        for c in s[1:-1]:
            score += 1 if c == '0' else -1
            ans = max(ans, score)
        return ans

复杂度分析

第一种时间复杂度为O(n2),空间复杂度为O(1)

第二种时间复杂度为O(n),空间复杂度为O(1)

3.统计范围内元音字符串数

给你一个下标从 0 开始的字符串数组 words 和两个整数:left 和 right 。

如果字符串以元音字母开头并以元音字母结尾,那么该字符串就是一个 元音字符串 ,其中元音字母是 'a''e''i''o''u' 。

返回 words[i] 是元音字符串的数目,其中 i 在闭区间 [left, right] 内。

解题思路

暴力解就完事了

代码实现

注意应该把列表换为集合(set),提高运行效率

class Solution:
    def vowelStrings(self, words: List[str], left: int, right: int) -> int:
        def isVowel(char):
            if char in ["a", "o", "e", "i", "u"]:
                return True
            else:
                return False 
        sum = 0
        for i in range(left, right + 1):
            if isVowel(words[i][0]) and isVowel(words[i][len(words[i]) - 1]):
                sum += 1
        return sum

复杂度分析

时间O(n+a),空间O(a)

4.山脉数组的峰顶索引

符合下列属性的数组 arr 称为 山脉数组 :

  • arr.length >= 3
  • 存在 i0 < i < arr.length - 1)使得:
    • arr[0] < arr[1] < ... arr[i-1] < arr[i]
    • arr[i] > arr[i+1] > ... > arr[arr.length - 1]

给你由整数组成的山脉数组 arr ,返回满足 arr[0] < arr[1] < ... arr[i - 1] < arr[i] > arr[i + 1] > ... > arr[arr.length - 1] 的下标 i 。

你必须设计并实现时间复杂度为 O(log(n)) 的解决方案。

解题思路

二分法秒了

代码实现

class Solution:
    def peakIndexInMountainArray(self, arr: List[int]) -> int:
        left = 0
        right = len(arr) - 1
        while left != right:
            mid = (left + right) // 2
            if arr[mid] == max(arr[mid], arr[mid-1], arr[mid+1]):
                return mid
            elif arr[mid] < arr[mid - 1]:
                right = mid
            else:
                left = mid

复杂度分析

时间O(log n),空间O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值