目录
题目:剑指 Offer 56 - II. 数组中数字出现的次数 II - 力扣(Leetcode)
题目的接口:
解题思路:
代码:
过啦!!!
题目:剑指 Offer 57. 和为s的两个数字 - 力扣(Leetcode)
题目的接口:
解题思路:
代码:
过啦!!!
题目:剑指 Offer 57 - II. 和为s的连续正数序列 - 力扣(Leetcode)
题目的接口:
解题思路:
代码:
过啦!!!
写在最后:
题目:剑指 Offer 56 - II. 数组中数字出现的次数 II - 力扣(Leetcode)
题目的接口:
class Solution {
public:
int singleNumber(vector<int>& nums) {
}
};
解题思路:
这道题我水平有限,
我就直接用哈希表计数,
然后再遍历整个哈希表,找出只出现一次的数即可,
下面是代码:
代码:
class Solution {
public:
int singleNumber(vector<int>& nums) {
unordered_map<int, int> mp;
for(auto& e : nums) mp[e]++; //用哈希表存
for(auto k : mp) if(k.second == 1) return k.first; //返回只有一个的值
return 1;
}
};
过啦!!!
题目:剑指 Offer 57. 和为s的两个数字 - 力扣(Leetcode)
题目的接口:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
}
};
解题思路:
这道题我一开始用的是双指针遍历整个数组,
然后计算结果,
然后我就超时了,
这道题由于他是一个有序数组,
所以我们还有一种双指针的做法,
就是两段逼近的双指针思想,
所以我就再用了一次双指针,
结论:
如果是有序数组的话,两端逼近的双指针效率
比从起点开始的双指针更高。
下面是代码:
代码:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> v;
//两段逼近的双指针
int l = 0, r = nums.size() - 1;
while(l < r) {
if(nums[l] + nums[r] > target) r--;
else if(nums[l] + nums[r] < target) l++;
else { //如果找到了
v.push_back(nums[l]);
v.push_back(nums[r]);
return v;
}
}
return v;
}
};
过啦!!!
题目:剑指 Offer 57 - II. 和为s的连续正数序列 - 力扣(Leetcode)
题目的接口:
class Solution {
public:
vector<vector<int>> findContinuousSequence(int target) {
}
};
解题思路:
这道题的思路比较明显,
我们可以用滑动窗口去做,
运用滑动窗口的思想实现,然后将每一个符合条件的值
放进二维数组里面,最后返回即可。
下面是代码:
代码:
class Solution {
public:
vector<vector<int>> findContinuousSequence(int target) {
vector<vector<int>> vv;
//滑动窗口的左右边界
int l = 1, r = 1;
int sum = 0;
//因为 5 + 6 一定大于 9,所以我们的边界可以取到(target / 2 + 1)
while(l <= target / 2 + 1) {
if(sum < target) { //如果值小了,更新右边界
sum += r++;
}
else if(sum > target) { //如果值大了,更新左边界
sum -= l++;
}
else { //如果值等于target,存进二维数组,然后更新一下边界,不然会死循环
vector<int> v;
for(int i = l; i < r; i++) v.push_back(i);
vv.push_back(v);
//更新左边界
sum -= l++;
}
}
return vv;
}
};
过啦!!!
写在最后:
以上就是本篇文章的内容了,感谢你的阅读。
如果喜欢本文的话,欢迎点赞和评论,写下你的见解。
如果想和我一起学习编程,不妨点个关注,我们一起学习,一同成长。
之后我还会输出更多高质量内容,欢迎收看