leetcode练习 532 python实现(字典方式和二分搜索)
2017-12-03 15:39
567 查看
题532
题目要求在一个list中寻找差为固定值的pair的数量,具体如下:Given an array of integers and an integer k, you need to find the number of unique k-diff pairs in the array. Here a k-diff pair is defined as an integer pair (i, j), where i and j are both numbers in the array and their absolute difference is k.
Example 1:
Input: [3, 1, 4, 1, 5], k = 2
Output: 2
Explanation: There are two 2-diff pairs in the array, (1, 3) and (3, 5).
Although we have two 1s in the input, we should only return the number of unique pairs.
Example 2:
Input:[1, 2, 3, 4, 5], k = 1
Output: 4
Explanation: There are four 1-diff pairs in the array, (1, 2), (2, 3), (3, 4) and (4, 5).
Example 3:
Input: [1, 3, 1, 5, 4], k = 0
Output: 1
Explanation: There is one 0-diff pair in the array, (1, 1).
Note:
The pairs (i, j) and (j, i) count as the same pair.
The length of the array won’t exceed 10,000.
All the integers in the given input belong to the range: [-1e7, 1e7].
这个结果是很好实现的,但是会发现时间复杂度始终是O(n2),所以始终通过不了。后来利用python中的字典HashMap的思想,查找键值只需要O(1)的复杂度,对程序进行了改进,效果明显提升。
我的思路是:
1.K<0,返回0
2.K=0,先对nums进行set,找到不重复的元素,再对这些元素遍历,count它们出现的次数,若>1,说明有一个符合要求,sum+=1,最后返回sum
3.K>0, 先对nums进行set,以及sorted排序,for循环,建立一个dict,它的key是当前数nums[i]+k,它的值是nums[i],然后判断当前nums[i]是不是之前出现的某个数的key,若是,则出现了一对符合要求的pair,sum+=1,最后返回sum。
代码如下:
class Solution: def findPairs(self, nums, k): """ :type nums: List[int] :type k: int :rtype: int """ sum =0 nu= {} if k<0: return 0 if k!=0: nums = list(set(nums)) nums = sorted(nums) for i in range(len(nums)): nu[nums[i]+k] = nums[i] if nums[i] in nu.keys(): sum+=1 return sum else: nums1 = list(set(nums)) for i in nums1: if nums.count(i)>1: sum+=1 return sum nums=[1,1,1,2,1] k=1 s= Solution() print(s.findPairs(nums,k))
结果如下:
Accept结果:
思路2 二分查找
我的思路是:重要的一点是用二分搜索寻找nums[i]+k降低时间复杂度,同时分k=0和k!=0的情况具体分析。k=0时,需要找相等的数字对,重点是一个去重的实现。
k!=0时的去重,只要之前遇到的相同的数就continue掉,并且在找到第一个符合条件的nums[i]后就continue,不再继续寻找。
具体代码如下:
class Solution: def findPairs(self, nums, k): """ :type nums: List[int] :type k: int :rtype: int """ if len(nums)==0: return 0 nums.sort() sum = 0 s = nums[0] flag = 0 if k ==0: for i in range(len(nums)): if k == 0: if i > 0 and nums[i] == s: flag = 1 if (flag == 1 and nums[i] != s) or (flag ==1 and i==len(nums)-1): flag = 0 s = nums[i] sum += 1 return sum if k != 0: for i in range(len(nums)-1): if i > 0 and nums[i] == nums[i - 1]: continue left = i right = len(nums) while (left <= right): mid = int((left + right) / 2) if mid < len(nums): if nums[i] + k > nums[mid]: left = mid + 1 if nums[i] + k < nums[mid]: right = mid - 1 if nums[i] + k == nums[mid]: sum += 1 break else: break return sum nums=[1,1,1,1,1,2,2,2] k=0 s= Solution() print(s.findPairs(nums,k))
4000
最终也能Accept
相关文章推荐
- python实现二分搜索树以及改进后的AVL Tree
- 算法练习--二分搜索哈希表-JS 实现
- leetcode练习(204) 多种方法求质数 python实现
- 二分搜索树-BST,python实现
- 算法练习--二分搜索哈希表-JS 实现
- 笨办法学 Python · 续 练习 21:二分搜索
- python-实现二分搜索
- python用递归方式实现目录及子目录的搜索
- 二分查找的两种实现方式(递归和非递归)--python实现
- 排序和搜索(二)——python实现二分查找
- leetcode练习(35,38) python实现
- leetcode练习(441,442)python实现
- 使用python代码实现三叉搜索树高效率”自动输入提示”功能
- 二分搜索树排序binary search sorting的c++实现
- 各种常用Python字典应用方式详解
- python字典数组排序实现
- python字典实现按照自定义顺序排序
- 二分搜索(折半搜索)的实现
- 二分搜索(BinarySearch)的分治思想C语言实现
- python中package机制的两种实现方式