标签:03 return 顺位 重复 nums 交换 int 数组
题目:剑指 Offer 03. 数组中重复的数字(E)
解题思路1:
首先看到题,第一眼就想到使用字典、列表或者集合等容器进行存储,如果查到在容器中已经存在,则返回该数。
时间:\(O(N)\)
空间:\(O(N)\)
class Solution:
def findRepeatNumber(self, nums: List[int]) -> int:
dic = {}
for i in nums:
if i in dic: return i
dic[i] = 1
return
优质解答:原地交换
遍历数组,由于数组的特殊性,n个数的大小都在\([0,n-1]\)内,碰到数则判断其是否在自己按照大小排序的位置上,如0应该在数组的第一位即nums[0],如果不在,则将其与自己顺位上的数进行交换同时进行判断,如果该数与自己相同,则代表遇到了重复数字,直接将其返回即可;如果不同,则进行交换,交换后此时自己已经在顺位上,此时继续判断交换的数是否来到他的顺位上,如果不在其顺位上则继续进行交换,直到进行交换的两个数都来到顺位上,此时i+1继续往后遍历直到数组末端。
时间:\(O(N)\)
空间:\(O(1)\)
class Solution:
def findRepeatNumber(self, nums: List[int]) -> int:
for i in range(len(nums)):
while nums[i] != i:
if nums[i] == nums[nums[i]]: return nums[i]
nums[nums[i]], nums[i] = nums[i], nums[nums[i]]
return
遇到问题及解决方法:
- 在选用容器时需要注意其查找的时间复杂度,list的查找复杂度为\(O(N)\),字典和集合则是\(O(1)\),其本质都是哈希表,Python3.7以后字典为有序,而集合无序,所以一般选用字典即可
标签:03,return,顺位,重复,nums,交换,int,数组 来源: https://www.cnblogs.com/BakeryOwner/p/16088714.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。