leecode刷题初级-数组【python版本】

删除排除数组中的重复项:

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

由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。

将最终结果插入 nums 的前 k 个位置后返回 k 。

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

我的回答:

类似于双指针,利用i,j分别指向待交换的位置以及向后比较的位置,当i,j位置两个数相等时,j指针向后移;当j指针位置的数大于i指针位置的数时,与i+1指针的位置进行交换,此时i=i+1,j=j+1,持续比较,直到j指向末端。当然如果整个数组中没有重复数字时,可以判定j-i>1再进行数值交换操作(亲测内存增长,耗时不变)。

class Solution(object):
    def removeDuplicates(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if len(nums) < 1:
            return len(nums), nums
        i, j = 0, 1
        while (i < j) and (j<len(nums)):
            if nums[i] == nums[j]:
                j+=1
            elif nums[i] < nums[j]:
                # change num 
                i+=1
                p = nums[i]
                nums[i] = nums[j]
                nums[j] = p
                j+=1
        return i+1
            

 买卖股票的最佳时机 II

给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。

在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。

返回 你能获得的 最大 利润 。

我的回答:

找到所有的涨幅,并相加。

[7, 1, 5, 6, 3] 第二天买入,第四天卖出,收益最大(6-1),所以一般人可能会想,怎么判断不是第三天就卖出了呢? 这里就把问题复杂化了,根据题目的意思,当天卖出以后,当天还可以买入,所以其实可以第三天卖出,第三天买入,第四天又卖出((5-1)+ (6-5) === 6 - 1)。所以算法可以直接简化为只要今天比昨天大,就卖出。

class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        ans = 0
        for i in range(1, len(prices)):
            if prices[i] > prices[i-1]:
                ans += prices[i] - prices[i-1]
        return ans

 旋转数组

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

例:

输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]

我的回答:

先将所有的数字进行倒叙,然后将前k个数进行倒叙,k之后的数字进行倒叙;

class Solution(object):
    def rotate(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        def ro(ls):
            i,j = 0,len(ls)-1
            while i<j:
                p = ls[i]
                ls[i] = ls[j]
                ls[j] = p
                i+=1
                j-=1
            return ls
        k = k %len(nums)
        nums = ro(nums)
        nums[:k] = ro(nums[:k])
        nums[k:] = ro(nums[k:])
        return nums

 一个比较简单的做法,直接利用python中list的特性:

class Solution(object):
    def rotate(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        k = k %len(nums)
        nums[:] = nums[-k:] + nums[:-k]
        return nums

 存在重复元素

给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。

我的回答:

第一反应是直接去重之后,比较大小。试一下提交之后的内存消耗及用时

class Solution(object):
    def containsDuplicate(self, nums):
        """
        :type nums: List[int]
        :rtype: bool
        """
        return len(nums) != len(set(nums))

想一下,还有没有其他的方法:

1. 排序后,重复的会相邻,可以比较

直接使用sort排序:

class Solution(object):
    def containsDuplicate(self, nums):
        """
        :type nums: List[int]
        :rtype: bool
        """
        nums.sort()
        for i in range(1, len(nums)):
            if nums[i-1] == nums[i]:
                return True
        return False

 2. 插入其他的数组,之后再判定是否在其中;

这里我直接pop出一个元素进行判断,就不新建一个list了。

class Solution(object):
    def containsDuplicate(self, nums):
        """
        :type nums: List[int]
        :rtype: bool
        """
        while len(nums):
            d = nums.pop()
            if d in nums:
                return True
        return False

python写的话会超时,同时新建list也会超时

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值