题目:剑指 Offer 56 - II. 数组中数字出现的次数 II - 力扣(Leetcode)
题目的接口:
class Solution { public: int singleNumber(vector& nums) { } };
解题思路:
这道题我水平有限,
我就直接用哈希表计数,
然后再遍历整个哈希表,找出只出现一次的数即可,
下面是代码:
代码:
class Solution { public: int singleNumber(vector& nums) { unordered_map 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 twoSum(vector& nums, int target) { } };
解题思路:
这道题我一开始用的是双指针遍历整个数组,
然后计算结果,
然后我就超时了,
这道题由于他是一个有序数组,
所以我们还有一种双指针的做法,
就是两段逼近的双指针思想,
所以我就再用了一次双指针,
结论:
如果是有序数组的话,两端逼近的双指针效率
比从起点开始的双指针更高。
下面是代码:
代码:
class Solution { public: vector twoSum(vector& nums, int target) { vector 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> findContinuousSequence(int target) { } };
解题思路:
这道题的思路比较明显,
我们可以用滑动窗口去做,
运用滑动窗口的思想实现,然后将每一个符合条件的值
放进二维数组里面,最后返回即可。
下面是代码:
代码:
class Solution { public: vector> findContinuousSequence(int target) { vector> 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 v; for(int i = l; i < r; i++) v.push_back(i); vv.push_back(v); //更新左边界 sum -= l++; } } return vv; } };
过啦!!!
写在最后:
以上就是本篇文章的内容了,感谢你的阅读。
如果喜欢本文的话,欢迎点赞和评论,写下你的见解。
如果想和我一起学习编程,不妨点个关注,我们一起学习,一同成长。