刷题-算法(CodeTop)

  • Post author:
  • Post category:其他


1. 数组中的第K个最大元素

描述:

给定整数数组

nums

和整数

k

,请返回数组中第


k


个最大的元素。

请注意,你需要找的是数组排序后的第

k

个最大的元素,而不是第

k

个不同的元素。

你必须设计并实现时间复杂度为

O(n)

的算法解决此问题。

思路:

这是一个经典的算法问题,可以使用快速选择算法来解决。快速选择算法是一种基于分治思想的算法,其时间复杂度为 O(n)。

快速选择算法的基本思路是:首先选择一个枢轴元素,然后将数组中小于等于枢轴元素的元素放在左侧,大于枢轴元素的元素放在右侧,最后返回枢轴元素的位置。如果数组中有重复元素,则只需找到其中一个即可。

代码:

class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        def heap_max(arr, root, arr_len):
            larger_idx = root
            if 2 * root + 1 < arr_len and arr[2 * root + 1] > arr[larger_idx]:
                larger_idx = 2 * root + 1

            if 2 * root + 2 < arr_len and arr[2 * root + 2] > arr[larger_idx]:
                larger_idx = 2 * root + 2

            if larger_idx != root:
                arr[root], arr[larger_idx] = arr[larger_idx], arr[root]
                heap_max(arr, larger_idx, arr_len)

        def heapsort(arr):
            for i in range(n - 1, -1, -1):
                heap_max(arr, i, n)

            for i in range(n - 1, n - 1 - k, -1):
                arr[i], arr[0] = arr[0], arr[i]
                heap_max(arr, 0, i)

        n = len(nums)
        heapsort(nums)

        return nums[-k]

2

描述:

给你两个单词

word1



word2



请返回将

word1

转换成

word2

所使用的最少操作数

你可以对一个单词进行如下三种操作:

  • 插入一个字符
  • 删除一个字符
  • 替换一个字符

思路:


力扣

代码:

class Solution:
    def minDistance(self, word1: str, word2: str) -> int:
        n = len(word1)
        m = len(word2)
        
        if n * m == 0:
            return n + m
        
        # 因为第0行和第0列是空字符串像非空字符串转移
        dp = [[0] * (m+1) for _ in range(n+1)]
        for i in range(n+1):
            dp[i][0] = i

        for i in range(m+1):
            dp[0][i] = i

        for i in range(1, n+1):
            for j in range(1, m+1):
                if word1[i-1] == word2[j-1]:
                    min_v = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1] - 1)
                    dp[i][j] = 1 + min_v
                else:
                    min_v = min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1])
                    dp[i][j] = 1 + min_v

        return dp[n][m]

3

描述:

思路:

代码:

4

描述:

思路:

代码:

5

描述:

思路:

代码:

6

描述:

思路:

代码:

7

描述:

思路:

代码:

8

描述:

思路:

代码:

9

描述:

思路:

代码:

10

描述:

思路:

代码:

11

描述:

思路:

代码:

12

描述:

思路:

代码:

13

描述:

思路:

代码:

14

描述:

思路:

代码:

15

描述:

思路:

代码:

16

描述:

思路:

代码:

17

描述:

思路:

代码:

18

描述:

思路:

代码:

19

描述:

思路:

代码:

20

描述:

思路:

代码:

21

描述:

思路:

代码:

22

描述:

思路:

代码:

23

描述:

思路:

代码:

24

描述:

思路:

代码:

25

描述:

思路:

代码:

26

描述:

思路:

代码:

27

描述:

思路:

代码:

28

描述:

思路:

代码:

29

描述:

思路:

代码:

30

描述:

思路:

代码:

31

描述:

思路:

代码:

32

描述:

思路:

代码:

33

描述:

思路:

代码:

34

描述:

思路:

代码:

35

描述:

思路:

代码:

36

描述:

思路:

代码:

37

描述:

思路:

代码:

38

描述:

思路:

代码:

39

描述:

思路:

代码:

40

描述:

思路:

代码:

41

描述:

思路:

代码:

42

描述:

思路:

代码:

43

描述:

思路:

代码:

44

描述:

思路:

代码:

45

描述:

思路:

代码:

46

描述:

思路:

代码:

47

描述:

思路:

代码:

48

描述:

思路:

代码:

49

描述:

思路:

代码:

50

描述:

思路:

代码:

51

描述:

思路:

代码:

52

描述:

思路:

代码:

53

描述:

思路:

代码:

54

描述:

思路:

代码:

55

描述:

思路:

代码:

56

描述:

思路:

代码:

57

描述:

思路:

代码:

58

描述:

思路:

代码:

59

描述:

思路:

代码:

60

描述:

思路:

代码:

61

描述:

思路:

代码:

62

描述:

思路:

代码:

63

描述:

思路:

代码:

64

描述:

思路:

代码:

65

描述:

思路:

代码:

66

描述:

思路:

代码:

67

描述:

思路:

代码:

68

描述:

思路:

代码:

69

描述:

思路:

代码:

70

描述:

思路:

代码:

71

描述:

思路:

代码:

72

描述:

思路:

代码:

73

描述:

思路:

代码:

74

描述:

思路:

代码:

75

描述:

思路:

代码:

76

描述:

思路:

代码:

77

描述:

思路:

代码:

78

描述:

思路:

代码:

79

描述:

思路:

代码:

80

描述:

思路:

代码:

81

描述:

思路:

代码:

82

描述:

思路:

代码:

83

描述:

思路:

代码:

84

描述:

思路:

代码:

85

描述:

思路:

代码:

86

描述:

思路:

代码:

87

描述:

思路:

代码:

88

描述:

思路:

代码:

89

描述:

思路:

代码:

90

描述:

思路:

代码:

91

描述:

思路:

代码:

92

描述:

思路:

代码:

93

描述:

思路:

代码:

94

描述:

思路:

代码:

95

描述:

思路:

代码:

96

描述:

思路:

代码:

97

描述:

思路:

代码:

98

描述:

思路:

代码:

99

描述:

思路:

代码:

100

描述:

思路:

代码:



版权声明:本文为zhang2010hao原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。