20220213_datawhale34期_leetcode

一 数组

1.1 基础

数组(Array):一种线性表数据结构。它使用一组连续的内存空间,来存储一组具有相同类型的数据。

相同类型的数据元素构成的有序集合.
→ 注意定义里的 ----- 一组连续的内存空间

  • 特点: 支持随机访问
  • 关键: 索引寻址

一维数组示例 :
在这里插入图片描述


  • 数组和链表操作速度对比:

1.2 题目

1.2.1 15 . 三数之和

  • 思路: 先排序 >>> 其次利用指针i遍历一遍数组 >>> 再利用target - num[i]将区间[i + 1, n]内转换为两数之和问题 >>>> 利用left, right双指针解决问题 >>>> 最后注意得考虑重复元素问题
class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        nums.sort()
        ans, n = [], len(nums)
        for i in range(n):
            if i > 0 and nums[i] == nums[i - 1]: #遍历略去重复的nums[i]
                continue
            
            right = n - 1
            for left in range(i + 1, n - 1):
                if left > i + 1 and nums[left] == nums[left - 1]:
                    continue
                while left < right and nums[left] + nums[right] > -nums[i]:
                    right -= 1         #若大于target(0 - nums[i]) , right左移
                if left < right and nums[left] + nums[right] == -nums[i]:
                    ans.append([nums[i],nums[left],nums[right]])
        return ans

1.2.2 26 . 删除有序数组中的重复项

  • 思路: 建立快慢双指针slow, fast解决问题 >>> fast负责遍历数组, slow负责记录不重复元素 >>> 注意返回 slow + 1
class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        fast, slow = 0, 0
        while fast < len(nums):
            if nums[fast] != nums[slow]:
                slow += 1
                nums[slow] = nums[fast]
            fast += 1
        return slow + 1

1.2.3 27 . 移除元素

  • 思路: 与上题一样利用快慢双指针slow, fast解决问题 >>>> fast负责遍历数组, slow负责记录不为val元素 >>>先替换再记录 >>> 注意返回 slow
class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        slow, fast = 0, 0
        while fast < len(nums):
            if nums[fast] != val:
                nums[slow] = nums[fast]
                slow += 1
            fast += 1
        return slow 

参考资料

1.https://github.com/itcharge/LeetCode-Py Datewhale–31期算法leetcode刷题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值