python 数组 相关算法题 (基础二)
Posted 疯子!!!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 数组 相关算法题 (基础二)相关的知识,希望对你有一定的参考价值。
题目:力扣
1. 求两个数组的交集
给定两个数组,编写一个函数来计算它们的交集
说明:
输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。
我们可以不考虑输出结果的顺序。
"""
例1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]
例2:
输入:nums1 = [1,2,2,1], nums2 = [2]
输出:[2]
例3:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]
"""
def find_sample(nums1, nums2):
d =[]
for i in nums1:
if i not in nums2:
continue
else:
d.append(i)
# 如果不remove会重复判断,当nums1[1, 2, 2, 1], nums2[2] 不remove时结果是[2, 2],是错误的,remove之后应该返回[2]
nums2.remove(i)
return d
def find_sample(nums1, nums2):
nums1 = sorted(nums1)
return [nums1.pop(nums1.index(i)) for i in nums2 if i in nums1]
# 速度最快
def find_sample(nums1, nums2):
import collections
nums1 = collections.Counter(num1)
nums2 = collections.Counter(num2)
nums = nums1 & nums2
return list(nums.elements())
官方的解答: 排序+双指针
将两个数组进行排序,随后用双指针顺序查找相同的元素
时间复杂度:O(max(nlogn, mlogm, n+m))
空间复杂度:O(1)
(nn,mm 分别为两个数组的长度)
如果是进阶问题一中已排序的数组,则只需 O(n)的时间复杂度
def intersect(nums1, nums2):
nums1.sort()
nums2.sort()
r = []
left, right = 0, 0
while left < len(nums1) and right < len(nums2):
if nums1[left] < nums2[right]:
left += 1
elif nums1[left] == nums2[right]:
r.append(nums1[left])
left += 1
right += 1
else:
right += 1
return r
2. 数字加一
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
输入:digits = [1,2,3] 输出:[1,2,4]
输入:digits = [0] 输出:[1]
输入:digits = [9] 输出:[1,0]
def calcute_li(li):
return [int(j) for j in str(int(''.join([str(i) for i in li]))+1)]
3. 移动数组中的0
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
输入: [0,1,0,45,12] 输出: [1,45,12,0,0]
- 必须在原数组上操作,不能拷贝额外的数组。
- 尽量减少操作次数。
def moveZeroes(nums):
fast = 0
slow = 0
while fast < len(nums):
if nums[fast] != 0:
nums[slow], nums[fast] = nums[fast], nums[slow]
slow += 1
fast += 1
return nums
def moveZeroes(nums):
for i in range(len(nums)):
if nums[i] == 0:
nums.remove(0)
nums.append(0)
return nums
4..两数之和
给定一个整数数组 nums 和一个整数目标值 target,在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标; 每种输入只会对应一个答案; 但是,数组中同一个元素在答案里不能重复出现,可以按任意顺序返回答案
输入: nums = [3, 2, 3, 3 ] 输出:target = 6 返回:2, 0
def two_sum(nums, target):
res = dict()
for k, v in enumerate(nums):
temp = target - v
if res.get(temp) is not None:
return k, res[temp]
else:
res[v] = k
return 0, 0
以上是关于python 数组 相关算法题 (基础二)的主要内容,如果未能解决你的问题,请参考以下文章