普通版 剑指 Offer 浅刷浅刷(18)


方法三:哈希表,没啥意思 。
剑指 Offer 57. 和为s的两个数字
class Solution {public:vector twoSum(vector& nums, int target) {int left = 0, right = nums.size() - 1;while (left < right) {if (nums[left] + nums[right] == target) {return {nums[left], nums[right]};} else if (nums[left] + nums[right] > target) {right--;} else {left++;}}return {};}};
没啥好说的,双指针,大了右–,小了左++ 。
剑指 Offer 57 - II. 和为s的连续正数序列
class Solution {public:vector> findContinuousSequence(int target) {vector> myVector;if (target <= 2) { //小于等于2就没有连续的序列,直接返回return myVector;}vector tempVector;int num = 1; //存储tempVector中数据的和tempVector.push_back(num); //先存入1while (tempVector.back() <= target / 2 + 2) {if (num == target) { //等于就存,先加再减myVector.push_back(tempVector); //将该vector加入返回的vectornum -= tempVector.front(); //减去要删除元素的值tempVector.erase(tempVector.begin()); //删除临时vector的第一个元素} else if (num > target) { //大于就删num -= tempVector.front(); //减去要删除元素的值tempVector.erase(tempVector.begin()); //删除临时vector的第一个元素} else { //小于就加tempVector.push_back(tempVector.back() + 1); //加入比原最后值大一的数num += tempVector.back(); //同时总值也的加}}return myVector;}};
使用滑动窗口解决,同时定义一个变量,存储这个窗口的总和,如果相等就存储起来同时删除窗口的第一个元素,如果大于就删除第一个元素,如果小于就再添加比原窗口大一的元素 。注意,删除和增加的同时,总和也的删除和增加 。
剑指 Offer 58 - I. 翻转单词顺序
class Solution {public:string reverseWords(string s) {string myString;stack> myStack;//使用循环压入栈for (int i = 0; i < s.length(); i++) {if (s[i] == ' ' && myString.length()) {myStack.push(myString);myString.erase(myString.begin(), myString.end());}if (s[i] != ' ') {myString += s[i];}}//将最后一次的数据压入栈if (myString.length()) {myStack.push(myString);myString.erase(myString.begin(), myString.end());}//拼接字符串while (!myStack.empty()) {myString.append(myStack.top());myStack.pop();if (!myStack.empty()) {myString += ' ';}}return myString;}};
将每个单词压入栈中,最后弹出,再拼接就完了 。
剑指 Offer 58 - II. 左旋转字符串
//方法一:class Solution {public:string reverseLeftWords(string s, int n) {string oneString = s.substr(0, n);string twoString = s.substr(n, s.size() - n);return twoString + oneString;}};//方法二:class Solution {public:string reverseLeftWords(string s, int n) {s = s.insert(s.size(), s.substr(0, n)); //向最后添加转的字符s = s.erase(0, n); //删除开始到第n位字符return s;}};
方法一:截取两段然后拼接 。
方法二:先向最后添加转的字符,然后删除开始到第n位字符 。
剑指 Offer 59 - I. 滑动窗口的最大值
//方法一:class Solution {public:vector maxSlidingWindow(vector& nums, int k) {vector myVector;priority_queue> bigQueue;for (int i = 0; i < nums.size(); i++) {bigQueue.emplace(nums[i], i);if (i + 1 >= k) {while (bigQueue.top().second <= i - k) {bigQueue.pop();}myVector.push_back(bigQueue.top().first);}}return myVector;}};//方法二:class Solution {public:vector maxSlidingWindow(vector& nums, int k) {vector myVector;deque indexQueue;for (int i = 0; i < nums.size(); i++) {while (!indexQueue.empty() && nums[i] > nums[indexQueue.back()]) {indexQueue.pop_back();}indexQueue.push_back(i);if (i + 1 >= k) {while (indexQueue.front()