AcWing&Leetcode好题分享(入门级)day01
前言
作者大三计科学生一枚,分享一下自己每天的做题记录,会尽量分享自己觉得质量高的题目,希望能够帮助到大家
1.找出数组中重复的数字
给定一个长度为 n 的整数数组 nums,数组中所有的数字都在 0∼n−1 的范围内。
数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。
请找出数组中任意一个重复的数字。
注意:如果某些数字不在 0∼n−1 的范围内,或数组中不包含重复数字,则返回 -1;
数据范围
0≤n≤1000
样例
给定 nums = [2, 3, 5, 4, 3, 2, 6, 7]。
返回 2 或 3。
题目分析:我的思路是运用STL来做
因为题目中的注意(tips)要求若某些数字不在 0∼n−1 的范围内,或数组中不包含重复数字,则返回 -1,所以需要特判 一个for循环搞定
for(int i=0;i<nums.size();++i) if(!(nums[i]>=0 && nums[i]<=nums.size()-1)) return -1;
本题筛选重复数字,利用set的自动去重的特性来做这题,完整代码如下
class Solution {
public:
int duplicateInArray(vector<int>& nums) {
set<int> S;
for(int i=0;i<nums.size();++i)//若某些数字不在 0∼n−1 的范围内,则返回-1
if(!(nums[i]>=0 && nums[i]<=nums.size()-1)) return -1;
for(int i=0;i<nums.size();++i)
{
int temp=S.size();//还未插入新元素时set集合中的元素个数
S.insert(nums[i]);//插入元素,若nums[i]与set中的元素不重复,则成功插入,size+1,否则size保持不变
if(temp==S.size()) return nums[i];
}
return -1;//数组中不包含重复数字
}
};
2.最小的k个数(力扣剑指 Offer 40. 最小的k个数)
输入 n 个整数,找出其中最小的 k 个数。
注意:
输出数组内元素请按从小到大顺序排序;
数据范围
1≤k≤n≤1000
样例
输入:[1,2,3,4,5,6,7,8] , k=4
输出:[1,2,3,4]
题目分析:经典题目(笔试&面试)
这题如果在卡空间的情况下 用大顶堆来做是非常好的一种做法 正确性:(堆排序) O(nlogk) 维护一个大小为k的大根堆,将数组元素都push进堆,当堆中的数大于k时弹出堆顶元素。
注意(tips):C++STL自带堆:priority_queue(priority_queue的底层实现--heap)
另外priority_queue默认大顶堆(降序)所以弹出堆顶的顺序是从大到小的k个数,应进行逆序操作
//完整代码
class Solution {
public:
vector<int> getLeastNumbers_Solution(vector<int> input, int k) {
vector<int> res;
priority_queue<int> heap;
for(auto x:input)
{
heap.push(x);
if(heap.size()>k) heap.pop();
}
while(heap.size())
{
res.push_back(heap.top());
heap.pop();
}
reverse(res.begin(),res.end());
return res;
}
};
3.和为S的两个数字
输入一个数组和一个数字 s,在数组中查找两个数,使得它们的和正好是 s。
如果有多对数字的和等于 s,输出任意一对即可。
你可以认为每组输入中都至少含有一组满足条件的输出。
数据范围
数组长度 [1,1002]。
样例
输入:[1,2,3,4] , sum=7
输出:[3,4]
题目分析:经典题目(笔试&面试)tag:哈希
掌握好的算法不仅可以大大优化时间空间复杂度,还可以让你的代码看起来更加短小精悍,如果你能够充分掌握这些算法技巧,自然娴熟地运用,必然可以更容易获得面试官的青睐。
//完整代码
/*创建哈希表后,对于每一个 x,我们查询哈希表中是否存在target-x时,若存在则返回[x,target-x]。
否则将x插入到哈希表中*/
class Solution {
public:
vector<int> findNumbersWithSum(vector<int>& nums, int target) {
unordered_map<int,int> hash;
int n=nums.size();
for(int i=0;i<n;++i)
{
if(hash[target-nums[i]]==0)//如果哈希表中没有x则先插入x到哈希表中
hash[nums[i]]++;
else
return{
nums[i],target-nums[i]};
}
return {
};
}
};
总结
算法的学习是一个长期的过程,特别是对于大学生的实习校招面试很多中厂大厂面试官总是喜欢问你算法的知识与题目。编程语言不断变化,但是很多底层的知识都与算法密切相关,算法也是体现程序员的内功。另外算法能力是发掘程序员的学习能力与成长潜力的关键手段,精进算法能力就是在搭建自己的技术体系,一个基本功扎实的人,无论是去做工程还是做算法,都会有所作为。