Leetcode 刷题之数组类
来源:互联网 发布:华为盒子无法连接网络 编辑:程序博客网 时间:2024/05/19 00:40
- 入门级
- 三路快排
- 指针对撞
- 滑动窗口
入门级
283. Move Zeroes
class Solution {public: void swap(vector<int>& nums, int a, int b) { int tmp = nums[a]; nums[a] = nums[b]; nums[b] = tmp; } void moveZeroes(vector<int>& nums) { int len = nums.size(); for(int i = 0, k = 0; i < len; i++) { if(nums[i]) { if(k != i) { swap(nums, i, k); } k++; } } }};
27. Remove Element
class Solution {public: void swap(vector<int>& nums, int a, int b) { int tmp = nums[a]; nums[a] = nums[b]; nums[b] = tmp; } int removeElement(vector<int>& nums, int val) { int len = nums.size(); int new_len = 0; for(int idx = 0; idx < len; idx++) { if(nums[idx] != val) { if(idx != new_len) { swap(nums, idx, new_len); } new_len++; } } return new_len; }};
26. Remove Duplicates from Sorted Array
class Solution {public: int removeDuplicates(vector<int>& nums) { int len = nums.size(); int new_len = 1; if(!len) { return 0; } int tmp = nums[0]; for(int idx = 1; idx < len; idx++) { if(tmp != nums[idx]) { if(new_len != idx) { nums[new_len] = nums[idx]; } new_len++; } tmp = nums[idx]; } return new_len; }};
80. Remove Duplicates from Sorted Array II
class Solution {public: int removeDuplicates(vector<int>& nums) { int len = nums.size(); int new_len = 1; if(!len) { return 0; } int tmp = nums[0]; bool isDiff = true; for(int idx = 1; idx < len; idx++) { if(tmp != nums[idx]) { if(new_len != idx) { nums[new_len] = nums[idx]; } isDiff = true; new_len++; } else { if(isDiff) { nums[new_len] = nums[idx]; new_len++; isDiff = false; } } tmp = nums[idx]; } return new_len; }};
三路快排
75. Sort Colors
最简单的就是计数排序,但是需要遍历两次:
class Solution {public: void sortColors(vector<int>& nums) { int len = nums.size(); int count[3] = {0}; for(int idx = 0; idx < len; idx++) { assert(nums[idx] >= 0 && nums[idx] <= 2); count[nums[idx]]++; } int stt = 0; for(int idx = 0; idx < 3; idx++) { for(int idx2 = 0; idx2 < count[idx]; idx2++) { nums[stt+idx2] = idx; } stt += count[idx]; } }};
三路快排的写法:
class Solution {public: void sortColors(vector<int>& nums) { int len = nums.size(); int zero = -1; int two = len; for(int idx = 0; idx < two;) { if(nums[idx] == 1) { idx++; } else if(nums[idx] == 2) { two--; nums[idx] = nums[two]; nums[two] = 2; } else { assert(nums[idx] == 0); zero++; nums[idx] = nums[zero]; nums[zero] = 0; idx++; } } }};
88. Merge Sorted Array
class Solution {public: void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) { assert(nums1.size() >= m+n); for(int idx = m - 1; idx >= 0; idx--) { nums1[idx+n] = nums1[idx]; } int idx1 = n; int idx2 = 0; int len = m+n; int idx = 0; while(idx1 < len && idx2 < n) { if(nums1[idx1] > nums2[idx2]) { nums1[idx++] = nums2[idx2++]; } else { nums1[idx++] = nums1[idx1++]; } } if(idx2 < n) { for(int i = idx2; idx2 < n; idx2++) { nums1[idx++] = nums2[idx2]; } } }};
指针对撞
167. Two Sum II - Input array is sorted
法一:使用二分查找
class Solution {public: vector<int> twoSum(vector<int>& numbers, int target) { int len = numbers.size(); int stt = 0; int fin = len - 1; vector<int> res; for(int idx1 = 0; idx1 < len - 1; idx1++) { while(idx1 > 0 && idx1 < len - 1 && numbers[idx1-1] == numbers[idx1]) { idx1++; } int tar = target - numbers[idx1]; int stt2 = idx1+1; int fin2 = fin; while(stt2 <= fin2) { int mid = stt2+((fin2-stt2)>>1); if(numbers[mid] < tar) { stt2++; } else if(numbers[mid] > tar) { fin2--; } else { res.push_back(idx1+1); res.push_back(mid+1); return res; } } } throw invalid_argument("No solution!"); return res; }};
法二:使用对撞指针,也叫做夹逼法。
class Solution {public: vector<int> twoSum(vector<int>& numbers, int target) { int len = numbers.size(); int stt = 0; int fin = len - 1; vector<int> res; while(stt < fin) { int sum = numbers[stt] + numbers[fin]; if(sum < target) { stt++; } else if(sum > target) { fin--; } else { res.push_back(stt+1); res.push_back(fin+1); return res; } } throw invalid_argument("No solution!"); return res; }};
125. Valid Palindrome
class Solution {public: bool isChar(char a) { return (a >= 'a'&& a <= 'z') || (a >= 'A' && a <= 'Z'); } bool isPalindrome(string s) { int len = s.size(); int stt = 0; int fin = len - 1; while(stt <= fin) { while(stt<=fin) { if(!isdigit(s[stt]) && !isChar(s[stt])) { stt++; if(stt > fin) { return true; } } else { break; } } while(stt<=fin) { if(!isdigit(s[fin]) && !isChar(s[fin])) { fin--; if(fin < stt) { return true; } } else { break; } } if(tolower(s[stt]) == tolower(s[fin])) { stt++; fin--; } else { return false; } } return true; }};
344. Reverse String
class Solution {public: string reverseString(string s) { int len = s.size(); int stt = 0; int fin = len - 1; while(stt < fin) { char tmp = s[stt]; s[stt] = s[fin]; s[fin] = tmp; stt++; fin--; } return s; }};
345. Reverse Vowels of a String
class Solution {public: bool isVowel(char a) { return a == 'a' || a == 'e' || a == 'i' || a == 'o' || a == 'u' || a == 'A' || a == 'E' || a == 'I' || a == 'O' || a == 'U'; } string reverseVowels(string s) { int len = s.size(); int stt = 0; int fin = len - 1; while(stt < fin) { while(stt < fin) { if(!isVowel(s[stt])) { stt++; } else { break; } if(stt >= fin) { return s; } } while(fin > stt) { if(!isVowel(s[fin])) { fin--; } else { break; } if(stt >= fin) { return s; } } char tmp = s[stt]; s[stt] = s[fin]; s[fin] = tmp; stt++; fin--; } return s; }};
11. Container With Most Water
class Solution {public: int maxArea(vector<int>& height) { int size = height.size(); assert(size >= 2); int stt = 0; int fin = size - 1; int higher = height[stt] > height[fin]?1:0; int res = higher?height[fin]*(fin-stt):height[stt]*(fin-stt); int left_max = height[stt]; int right_max = height[fin]; while(stt < fin) { if(!higher) { while(height[stt] <= left_max) { stt++; if(stt >= fin) { return res; } } left_max = height[stt]; } else { while(height[fin] <= right_max) { fin--; if(stt >= fin) { return res; } } right_max = height[fin]; } higher = left_max > right_max?1:0; int area = (higher?right_max:left_max)*(fin-stt); if(area > res) { res = area; } } return res; }};
滑动窗口
209. Minimum Size Subarray Sum
class Solution {public: int minSubArrayLen(int s, vector<int>& nums) { int len = nums.size(); int res = len + 1; int stt = 0; int fin = -1; int sum = 0; while(stt < len) { if(sum < s && fin + 1 < len) { fin++; sum += nums[fin]; } else { sum -= nums[stt]; stt++; } if(sum >= s) { res = min(fin-stt+1, res); } } return res==len+1?0:res; }};
3. Longest Substring Without Repeating Characters
class Solution {public: int lengthOfLongestSubstring(string s) { int len = s.size(); int idx1 = 0; int idx2 = -1; int rec[512] = {0}; int res = 0; while(idx1 < len) { if(idx2+1 < len && rec[s[idx2+1]] == 0) { idx2++; rec[s[idx2]]++; } else { rec[s[idx1]]--; idx1++; } res = max(idx2-idx1+1, res); } return res; }};
阅读全文
0 0
- Leetcode 刷题之数组类
- Leetcode之数组问题
- LeetCode之反转数组
- Leetcode题解之数组
- leetcode之数组左右夹逼法
- leetcode:数组之Two Sum
- leetcode:数组之Remove Element
- leetcode:数组之Rotate Image
- leetcode:数组之Rotate Image
- 数组之Next Permutation---leetcode
- leetcode数组之Plus One
- leetcode数组之Rotate Image
- leetcode数组之Valid Sudoku
- Leetcode数组类题目
- leetcode:数组之Longest Consecutive Sequence
- LeetCode之Spiral Matrix----圈圈访问数组
- leetcode数组之Trapping Rain Water
- leetcode(136)数组之Single Number
- [LC]202. happy numbers
- MySQL常用语句
- android 详解Handler内部源码机制
- Logistic 多分类
- 赵老师提供的TRACE格式化函数
- Leetcode 刷题之数组类
- 发布全新决策引擎MorUI2.0,蓦然认知助力传统产业智能化升级
- 领跑交互新时代 蓦然认知助力传统产业智能化升级
- 张近东王健林携600多位地产大佬 开了场火药味颇重的智慧零售大会
- 银河麒麟操作系统社区版4.0.2-SP2正式发布!
- 地平线发布中国首款 AI 视觉芯片,还想让每一辆自动驾驶汽车都有中国芯
- 深度 | AI芯片之智能边缘计算的崛起
- 阿里云AI走下PPT :我存在于这六大产业场景
- LTE-A为5G时代打头阵,高通持续引领移动通讯技术升级