voidbubble_sort(std::vector<int>& nums){ int n = nums.size(); for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - 1 - i; j++) { if (nums[j] > nums[j + 1]) { std::swap(nums[j], nums[j + 1]); } } } }
voidsellection_sort(std::vector<int>& nums){ int n = nums.size(); for (int i = 0; i < n; i++) { int min = i; for (int j = i + 1; j < n; j++) { if (nums[min] > nums[j]) { min = j; } } std::swap(nums[i], nums[min]); } }
intpartition(std::vector<int>& nums, int low, int high){ int pivot = nums[low]; while (low < high) { while (low < high && nums[high] > pivot) { high--; } nums[low] = nums[high]; while (low < high && nums[low] < pivot) { low++; } nums[high] = nums[low]; } nums[low] = pivot; return low; } voidquick_sort(std::vector<int>& nums, int low, int high){ if (low < high) { int pivot = partition(nums, low, high); quick_sort(nums, low, pivot - 1); quick_sort(nums, pivot + 1, high); } }
// 不使用+-来计算两数之和 intadd(int a, int b){ while (b) { int carry = (a & b) << 1; //进位 a = a ^ b; // 无进位结果 b = carry; } return a; } // 奇数的最低位总是1,偶数的最低位总是0 if (num & 1) { cout << "奇数" << endl; }
01背包
问题描述:给定 n 个物品,第 i 个物品的重量为 wgt[i−1]、价值为 val[i−1] ,和一个容量为 cap 的背包。每个物品只能选择一次,问在限定背包容量下能放入物品的最大价值。
classSolution { public: intmaxVowels(string s, int k){ unordered_set<char> vowles = {'a', 'e', 'i', 'o', 'u'}; int ans = 0; int cur = 0; for (int i = 0; i < s.size(); i++) { if (vowles.count(s[i]) > 0) { cur++; } if (i < k - 1) { continue; } ans = max(ans, cur); if (vowles.count(s[i - k + 1]) > 0) { cur--; } } return ans; } };
不定长滑动数组
给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
intlengthOfLongestSubstring(string s){ int res = 0; int left = 0; unordered_map<char, int> cnt; for (int right = 0; right < s.size(); right++) { cnt[s[right]]++; while (cnt[s[right]] > 1) { cnt[s[left]]--; left++; } res = max(res, right - left + 1); } return res; }
越长越合法
给你一个字符串 s ,它只包含三种字符 a, b 和 c 。
请你返回 a,b 和 c 都 至少 出现过一次的子字符串数目。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
intnumberOfSubstrings(string s){ int left = 0; unordered_map<char, int> cnt; int ans = 0; for (int right = 0; right < s.size(); right++) { cnt[s[right]]++; while (cnt['a'] && cnt['b'] && cnt['c']) { cnt[s[left]]--; left++; } ans += left; } return ans; }
现在的已经满足了,更长的子串就满足,+left
越短越合法
给你一个整数数组 nums 和一个整数 k ,请你返回子数组内所有元素的乘积严格小于 k 的连续子数组的数目。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
intnumSubarrayProductLessThanK(vector<int>& nums, int k){ int cur = 1; int res = 0; int left = 0; if (k <= 1) { return0; } for (int right = 0; right < nums.size(); right++) { cur *= nums[right]; while (cur >= k) { cur /= nums[left]; left++; } res += right - left + 1; } return res; }
intmy_fun(vector<int>& nums, int goal){ int left = 0; int res = 0; int cur = 0; for (int right = 0; right < nums.size(); right++) { cur += nums[right]; while (cur >= goal && left <= right) { cur -= nums[left]; left++; } res += left; } return res; } intnumSubarraysWithSum(vector<int>& nums, int goal){ returnmy_fun(nums, goal) - my_fun(nums, goal + 1); }
二分
1
mid = left + (right - left) / 2; //避免溢出
1 2 3 4 5 6 7 8 9 10 11 12 13 14
// lower_bound,指向第一个 ≥ value 的元素的迭代器。 intbinarySearch(vector<int>& nums,int target){ int left = 0; int right = nums.size() - 1; while (left <= right) { int mid = left + (right - left) / 2; if (nums[mid] >= target) { right = mid - 1; } else { left = mid + 1; } } return left; }
1
auto it = lower_bound(nums, target); //二分,返回的是迭代器,值为*it
1 2 3 4 5 6 7 8 9 10 11 12 13 14
// upper_bound,指向第一个 > value 的元素的迭代器。 intbinarySearch(vector<int>& nums,int target){ int left = 0; int right = nums.size() - 1; while (left <= right) { int mid = left + (right - left) / 2; if (nums[mid] > target) { right = mid - 1; } else { left = mid + 1; } } return left; }