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), numsi, j = 0, 1while (i < j) and (j<len(nums)):if nums[i] == nums[j]:j+=1elif nums[i] < nums[j]:# change num i+=1p = nums[i]nums[i] = nums[j]nums[j] = pj+=1return 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 = 0for 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)-1while i<j:p = ls[i]ls[i] = ls[j]ls[j] = pi+=1j-=1return lsk = 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 Truereturn 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 Truereturn False
python写的话会超时,同时新建list也会超时