python编程实战(六)

题目一:合并有序数组

给你两个按递增顺序 排列的整数数组 nums1nums2,另有两个整数 mn ,分别表示 nums1nums2 中的元素数目。

请你合并 nums2nums1 中,使合并后的数组同样按递增顺序排列。

关键数据结构:

List[]一维列表

关键方法:

.append();.sort()排序

关键思路:

nums1和nums2本身都是递增排序的,最简单的方法是直接把nums2中的元素合并到nums1中,然后使用.sort()方法对列表进行递增排序;

另外一种方法是双指针中的快慢指针法,用两个指针分别指向两个列表的头部,逐个比较元素大小,小的就放到新的列表中,然后指针右移动

复制代码
//法一:直接使用python中的sort()方法对合并后的数组排序
class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        """
        Do not return anything, modify nums1 in-place instead.
        """
        nums1[m:] = nums2
        nums1.sort()

//法二:使用快慢指针,逐个遍历两个列表中的元素,然后把小的放到新表中
class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        sorted = []
        p1,p2=0,0
        while p1 < m or p2 <n:
            if p1 == m:
                sorted.append(nums2[p2])
                p2+=1
            elif p2 == n:
                sorted.append(nums1[p1])
                p1+=1
            elif nums1[p1]<nums2[p2]:
                sorted.append(nums1[p1])
                p1+=1
            else:
                sorted.append(nums2[p2])
                p2+=1
        nums1[:] = sorted
//这里需要注意,如果直接写nums1=sorted,提交是会报错的;因为nums1作为传参,nums1=sorted并不改变其原地址上存储的值,而[:]方法会改变其原地址上的值

题目二:移除元素

给你一个数组 nums和一个值 val,你需要 原地 移除所有数值等于 val的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。

假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:

  • 更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
  • 返回 k

关键数据结构:

List[]一维列表

关键方法:

.remove();快慢指针

关键思路:

方法一:使用python中的remove方法可以直接把nums中的val元素去除掉,然后测量nums数组的长度k。remove方法是逐个进行删除的,所以需要与while循环搭配使用

方法二:快慢指针。用两个指针指向列表头部,一个指针用来遍历初始列表,另一个指针用来标识不含元素val的新列表

复制代码
//法一:直接用python中的remove()方法,移除指定元素后对统计列表长度即可
class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        while val in nums:
            nums.remove(val)
        return len(nums)

//法二:快慢指针。
class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        k=0
        for i in range(len(nums)):
            if nums[i] != val:
                //下标i对应的列表是旧的列表,下表k对应的列表是把非val元素放在前面的新表
                //最后只需要返回k即可
                nums[k]=nums[i]
                k +=1
        return k

题目三:删除有序数组中的重复项

给你一个 非严格递增排列 的数组 nums ,请你**原地** 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

考虑 nums 的唯一元素的数量为 k。去重后,返回唯一元素的数量 k

nums 的前 k 个元素应包含 排序后 的唯一数字。下标 k - 1 之后的剩余元素可以忽略。

关键数据结构:

List[]列表

关键思路:

快慢指针。同样的定义两个指针,快指针用于遍历整个列表,查找不重复元素;慢指针用于存储不重复元素,并把其覆盖在原列表上。所谓原地删除其实就是用新的元素把旧的元素覆盖,原地删除就是覆盖

复制代码
class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        if not nums:
            return 0
        fast,low = 1,1
        n = len(nums)
        while fast < n:
            //快指针用于遍历列表中的每个元素,并查找出不重复元素
            if nums[fast]!=nums[fast-1]:
                //慢指针来把不重复元素覆盖到原列表上
                nums[low]=nums[fast]
                low+=1
            fast+=1
        //返回不重复元素个数
        return low

题目四:删除有序数组中的重复项之二

给你一个有序数组 nums ,请你**原地** 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。

不要使用额外的数组空间,你必须在 原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

关键数据结构:

列表List[]

关键思路:

本题的思路和上一题是一样的,同样可以使用快慢指针,由于列表本身是有序的,判断一个元素是否出现超过两次,直接使用num[i-2]==num[i]即可,快指针用于遍历每个元素并查找重复出现两次以上元素,慢指针作为新列表的下标,将其存储起来并覆盖原列表

复制代码
class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        n = len(nums)
        if n<=2:
            return n
        slow,fast =2,2
        while fast <n:
            if nums[slow-2]!=nums[fast]:
                nums[slow]=nums[fast]
                slow+=1
            fast+=1
        return slow 
//本题和上一道题目的关键区别在于判断条件:nums[slow-2]!=nums[fast]
//上一题为:nums[fast-1]!=nums[fast]
//由于本题目要求的是新表中重复出现的数字可以出现至多两次,所以需要和有效表进行比对
//(机械记忆就好)
相关推荐
I_LPL2 小时前
day54 代码随想录算法训练营 图论专题8
数据结构·图论·拓扑排序·dijkstra算法
我能坚持多久2 小时前
【初阶数据结构10】——链式二叉树的功能实现
数据结构·算法
liuyao_xianhui2 小时前
优选算法_丢失的数字_位运算_C++
linux·数据结构·c++·算法·动态规划·哈希算法·散列表
啊哦呃咦唔鱼2 小时前
LeetCode hot100-239 滑动窗口最大值
数据结构·算法·leetcode
Book思议-2 小时前
【数据结构实战】 C 语言单链表通关:初始化 / 头插 / 尾插 / 增删改查全实现(附图解、可运行完整代码)
c语言·数据结构·算法
宵时待雨3 小时前
C++笔记归纳12:二叉搜索树
开发语言·数据结构·c++·笔记·算法
仰泳的熊猫3 小时前
题目2305:蓝桥杯2019年第十届省赛真题-等差数列
数据结构·c++·算法·蓝桥杯
jing-ya3 小时前
day 53 图论part5
java·数据结构·算法·图论
Yupureki3 小时前
《MySQL数据库基础》4. 数据类型
c语言·开发语言·数据结构·数据库·c++·mysql