Leetcode:https://leetcode-cn.com/problems/3sum/
给定一个包含n个整数的数组nums,判断nums中是否存在三个元素a,b,c,使得a+b+c=0?找出所有和为0且不重复的三元组。
【排序+双指针】
#include <iostream> #include <algorithm> #include <vector> using namespace std; class Solution{ public: vector<vector<int>> threeSum(vector<int>& nums){ vector< vector<int> > ans; if(nums.size() < 3 || nums.empty()) return ans; // 特判 int n = nums.size(); sort(nums.begin(), nums.end()); //排序 for(int i = 0; i < n; i++) // 枚举最小值 { if(nums[i] > 0) return ans; if(i > 0 && nums[i] == nums[i-1]) continue; // 最小元素去重! int l = i+1; int r = n-1; while(l < r) // 枚举中间值和最大值 { int x = nums[l] + nums[r] + nums[i]; if(x == 0){ // 符合条件,存储,并且去重,双端都移到下一个位置 ans.push_back({ nums[i], nums[l], nums[r] }); while( l < r && nums[l] == nums[l+1]) l++; l++; while( l < r && nums[r] == nums[r-1]) r--; r--; } else if(x > 0) // 大了就让右边最大值变小 r--; else // 小了就让左边中间值变大 l++; } } return ans; } }; int main() { int get; Solution sol; vector<int> nums; getchar(); while (cin >> get) { nums.push_back(get); if (cin.get() == ']') break; } cout << sol.threeSum(nums)[0][0] << endl; return 0; }
Leetcode:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
给定一个字符串s,找出其中不含有重复字符的最长子串的长度。
滑动窗口:核心思想就是从每一个字符开始,找到不包含重复字符的最长子串。每次移动区间的起点或者终点,直到起点的值等于终点的值。
#include <iostream> #include <string> using namespace std; class Solution { public: int lengthOfLongestSubstring(string s) { int start(0), end(0), length(0), result(0); int nSize = s.size(); while (end < nSize) { // 终点 char tmpChar = s[end]; for (int index = start; index < end; index++) { if (tmpChar == s[index]) { start = index + 1; length = end - start; break; } } end++; length++; result = max(result, length); } return result; } }; int main() { Solution sol; string s; cin >> s; cout << sol.lengthOfLongestSubstring(s) << endl; return 0; }