代码随想录刷题一:数组


前言

文章为记录刷代码随想录的过程,当做自己的笔记,实现代码为python3。如果大佬们有更好的方法欢迎评论留言。
Carl大佬的网站:https://www.programmercarl.com/


一、数组

1.二分查找

问题描述:
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,
写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
示例1:
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
示例2:
输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1

代码实现:

# 方式1:左闭右闭区间
class Solution1:
    def search(nums: list, target: int) -> int:
        left, right = 0, len(nums) - 1

        while left <= right:
            middle = (left + right) // 2

            if nums[middle] < target:
                left = middle + 1
            elif nums[middle] > target:
                right = middle - 1
            else:
                return middle
        return -1


ex1 = Solution1.search(nums=[-1, 0, 3, 5, 9, 12], target=9)
ex2 = Solution1.search(nums=[-1, 0, 3, 5, 9, 12], target=2)
print(ex1)
print(ex2)

# 方式2:左闭右开区间
class Solution2:
    def search(nums: list, target: int) -> int:
        left, right = 0, len(nums)
        while left < right:
            middle = (left + right) // 2

            if nums[middle] < target:
                left = middle + 1
            elif nums[middle] > target:
                right = middle
            else:
                return middle
        return -1


ex3 = Solution2.search(nums=[-1, 0, 3, 5, 9, 12], target=9)
ex4 = Solution2.search(nums=[-1, 0, 3, 5, 9, 12], target=2)
print(ex3)
print(ex4)

2.移除元素

问题描述:
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

示例 1: 给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。
你不需要考虑数组中超出新长度后面的元素。

示例 2: 给定 nums = [0,1,2,2,3,0,4,2], val = 2, 函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。

代码实现:

class Solution:
    """双指针法
    时间复杂度:O(n)
    空间复杂度:O(1)
    """
    def removeElement(nums: list, val: int) -> int:
        fast = slow = 0

        while fast < len(nums):

            if nums[fast] != val:
                nums[slow] = nums[fast]
                slow += 1

            # 当 fast 指针遇到要删除的元素时停止赋值
            # slow 指针停止移动, fast 指针继续前进
            fast += 1

        return slow


ex1 = Solution.removeElement(nums=[3,2,2,3], val=3)
print(ex1)
ex2 = Solution.removeElement(nums=[0,1,2,2,3,0,4,2], val=2)
print(ex2)

3.有序数组的平方和

问题描述:
给你一个按非递减顺序 排序的整数数组 nums,返回每个数字的平方 组成的新数组,要求也按非递减顺序排序。

示例 1: 输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100],排序后,数组变为 [0,1,9,16,100]

示例 2: 输入:nums = [-7,-3,2,3,11] 输出:[4,9,9,49,121]

代码实现:

class Solution:
    def sortedSquares(nums:list) -> list:
        n = len(nums)
        i,j,k = 0,n-1,n-1
        # 定义一个与nums长度相同的数组
        ans = [-1] * n
        while i <= j:
            left_num = nums[i] ** 2
            right_num = nums[j] ** 2
            if left_num > right_num:
                ans[k] = left_num
                i += 1
            else:
                ans[k] = right_num
                j -= 1
            k -= 1
        return ans


ex1 = Solution.sortedSquares(nums=[-4,-1,0,3,10])
print(ex1)
ex2 = Solution.sortedSquares(nums=[-7,-3,2,3,11])
print(ex2)


# 直接排序
class Solution:
    def sortedSquares(nums:list) -> list:
        return sorted(num * num for num in nums)

4.长度最小的子数组

问题描述:
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。
如果不存在符合条件的子数组,返回 0。

示例:
输入:s = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组 [4,3] 是该条件下的长度最小的子数组。

代码实现:

# 双指针,滑动窗
class Solution:
    def minSubArrayLen(s:int, nums:list) -> int:
        """
        python中正无穷:float("inf"), 负无穷float("-inf")
        类似在java中:Integer.MAX_VALUE表示int数据类型的最大取值数:2 147 483 647
                    Integer.MIN_VALUE表示int数据类型的最小取值数:-2 147 483 648
        """
        # 定义一个无限大的数
        result = float("inf")
        sum = 0  # 子数组之和
        left_index = 0
        for i in range(len(nums)):
            sum += nums[i]
            while sum >= s:
                result = min(result, i - left_index + 1)  # 取子序列的长度
                sum -= nums[left_index]
                left_index += 1
        return 0 if result==float("inf") else result


ex1 = Solution.minSubArrayLen(s=7,nums=[2,3,1,2,4,3])
print(ex1)

5.螺旋矩阵

问题描述:
给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。

示例:
输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]

代码实现:

class Solution:
    def generateMatrix(n:int ) -> list:
        """for _ in range(n)中 _ 占位符 表示不在意变量的值,只是用于循环遍历n次,无法打印变量值。"""
        nums = [[0] * n for _ in range(n)]  # 创建一个n维的矩阵,用0填充
        # print(nums)
        start_x, start_y = 0, 0  # 起始点
        # 表示整数除法,其 3 / 2 = 1.5,对1.5 向下取整 = 1
        loop, middle = n // 2, n // 2  # 迭代次数,n为奇数时矩阵的中心点
        count = 1   # 计数

        for offset in range(1, loop + 1):   # 每循环一层偏移量加1,偏移量从1开始
            for i in range(start_y, n - offset):  # 从左至右,左闭右开
                nums[start_x][i] = count
                count += 1
            for i in range(start_x, n - offset):  # 从上到下
                nums[i][n - offset] = count
                count += 1
            for i in range(n - offset, start_y, -1):  # 从右到左
                nums[n - offset][i] = count
                count += 1
            for i in range(n - offset, start_x, -1):  # 从上到下
                nums[i][start_y] = count
                count += 1
            start_x += 1   # 更新起始点
            start_y += 1

        if n % 2 != 0:  # n为奇数时,单独给矩阵中心点赋值
            nums[middle][middle] = count
        return nums


ex = Solution.generateMatrix(3)
print(ex)

总结

代码随想录刷题一:数组_第1张图片

你可能感兴趣的:(代码随想录刷题,python)