1.有序数组去重

博客探讨了如何在Python和C++中实现原地删除有序数组中的重复元素,强调了两种方法:双指针法和逆序删除法,并详细解释了这两种方法的实现过程。双指针法通过两个指针i和j,保持i指向不重复的元素,而逆序删除法则从后向前遍历数组,删除重复元素。两种方法都保证了空间复杂度为O(1)。此外,还介绍了Python中的del函数以及与C++的差异。
摘要由CSDN通过智能技术生成

题目要求

  1. 原地 (输入的资料通常会被要输出的部分覆盖掉)删除重复出现的元素
  2. 输出数组的长度和内容
  3. 空间复杂度O(1)
int[] nums = [...]; // 输入数组
int[] expectedNums = [...]; // 长度正确的期望答案

int k = removeDuplicates(nums); // 调用

assert k == expectedNums.length;
for (int i = 0; i < k; i++) {
    assert nums[i] == expectedNums[i];
}



########################################

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:

代码

由 int k = removeDuplicates(nums); // 调用:
可知函数输入为数组,输出为数组长度。
双指针法:
在这里插入图片描述

python3:

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        lenth = len(nums)
        i = 0
        j = 1
        while j < lenth :
            if nums[i] != nums[j]:
                i = i + 1
                nums[i] = nums[j]
            j = j + 1
        return i + 1
//////////////
if __name__ == '__main__':
    nums = list(map(int, input('请输入有序数组:').split()))
    print(nums[:removeDuplicates(nums)])

c++版:

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int length = nums.size();
        if (length == 0) return 0;
        int slow = 0, fast = 1;
        while (fast < length) {
            if (nums[fast] != nums[slow]) {
                nums[++slow] = nums[fast];
            }
            fast++;
        }
        return slow + 1;


    }
};

逆序删除法:

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        for i in range(len(nums) - 1, 0, -1):
            if nums[i] == nums[i - 1]:
                del nums[i]
        return len(nums)

for i in range(len(nums) - 1, 0, -1):

1.for i in sequence :为for循环,sequence为可迭代对象:列表,字典,字符串,元组,集合等。
2.rang():用于生成一系列连续整数,左闭右开[len(nums)-1,0),-1表示反向且步长为1

del nums[i]

del函数:python的del不同于C的free(负责将 malloc() 函数申请的空间给释放掉)和C++的delete(用于释放new[]分配的内存空间)。由于python都是引用,而python有GC机制,所以,del语句作用在变量上,而不是数据对象上。del删除的是变量,而不是数据。

if __name__=='__main__':  
    a=1       # 对象 1 被 变量a引用,对象1的引用计数器为1  
    b=a       # 对象1 被变量b引用,对象1的引用计数器加1  
    c=a       #1对象1 被变量c引用,对象1的引用计数器加1  
    del a     #删除变量a,解除a对1的引用  
    del b     #删除变量b,解除b对1的引用  
    print(c)  #最终变量c仍然引用1 

if __name__=='__main__':  
    li=[1,2,3,4,5]  #列表本身不包含数据1,2,3,4,5,而是包含变量:li[0] li[1] li[2] li[3] li[4]   
    first=li[0]     #拷贝列表,也不会有数据对象的复制,而是创建新的变量引用  
    del li[0]  
    print(li)      #输出[2, 3, 4, 5]  
    print(first)   #输出 1  

总结

1. python和cpp的区别 :

 1). cpp的if和while条件要有(),后续操作要有{ },相反python直接冒号:不用中括号,其缩进及其严格。
 2). cpp定义变量时前要有数据类型约束(定义函数时函数名前也要有数据类型),相反python不用约束直接取名定义变量。
 3). cpp每行代码结尾都要有分号;而python则不用

2.for循环(python): ↑

3.range()函数(python): ↑

4.del函数(python): ↑

5.有序数组去重(原地算法)空间复杂度O(1):
双指针法and逆序删除法(第二种空间占用率更低)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值