leetcode day1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof
剑指offer
03 数组中重复的数字
题目:在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
我的思路:直接二重遍历会超时,用一个数组存0~n-1分别出现的次数可行,但是时空复杂度都不是很好
其他思路:
1.hash表
2.排序后再从头到尾找一遍,排序就要nlogn复杂度
3.原地置换——这个时空复杂度应该最低吧
哈希表:python中字典dict
class Solution(object):
def findRepeatNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
mymap=dict()
for i in range(len(nums)):
if nums[i] in mymap:
return nums[i]
mymap[nums[i]]=i
哈希表搜索时间复杂度为O(1)
c++实现——map
用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
map<int,int> mp;
for(int i=0;i<nums.size();i++){
if(mp.find(nums[i]) != mp.end()) return nums[i];
else mp[nums[i]] ++;
}
return -1;
}
};
04 二维数组中的查找
题目:在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
我的思路:遍历行,若行的第一个数大于target,则返回false;对每一行,采用二分的方法搜索。时间复杂度O(nlogm),空间复杂度O(1)
其他思路:线性查找,时间复杂度O(n+m),空间复杂度O(1)
作者:jyd
链接:https://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof/solution/mian-shi-ti-04-er-wei-shu-zu-zhong-de-cha-zhao-zuo/
来源:力扣(LeetCode)