1. 两数之和
找出map中是否有target-nums[i],
class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> hash;for(int i = 0 ;i < nums.size(); i++){if(hash.find(target - nums[i]) != hash.end()){return {i, hash[target - nums[i]]};}else{hash[nums[i]] = i;}}}
};
26. 删除有序数组中的重复项
使用双指针
class Solution {
public:int removeDuplicates(vector<int>& nums) {int left = 0;int right = 1;while(right < nums.size()){if(nums[left] == nums[right]){right++;//数字相同时,right右移}else{nums[++left] = nums[right++];//不同时}}return left + 1;}
};
27. 移除元素
双指针
class Solution {
public:int removeElement(vector<int>& nums, int val) {int lowIndex =0;for(int fastIndex = 0; fastIndex < nums.size();fastIndex++){if(nums[fastIndex]!=val){nums[lowIndex++] = nums[fastIndex];}}return lowIndex;}
};
66. 加一
我写的,能过一半用例,笨方法。只是想确定一下笨方法可不可行,不管笨不笨,能拿到分就是好方法。
class Solution {
public:vector<int> plusOne(vector<int>& digits) {stack<int> stack;vector<int> res;uint num = 0;uint cont = 1;for(int i = digits.size()-1;i >= 0;i--){num += digits[i]*cont;cont *= 10;}cout <<num;num += 1;while(num!=0){stack.push(num%10);num = num/10;}while(!stack.empty()){res.push_back(stack.top());stack.pop();}return res;}
};
比较好的方法,使用笨方法的原因也是不知道vector可以很方便的在头插入数据。
class Solution {
public:vector<int> plusOne(vector<int>& digits) {int len = digits.size();for(int i = len - 1; i >=0; i--){if(++digits[i] < 10){return digits;}else{digits[i] = digits[i] % 10;}}digits.insert(digits.begin(), 1);return digits;}
};
88. 合并两个有序数组
题目没限制就用sort
class Solution {
public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {for(int i = 0; i !=n;i++){nums1[m+i] = nums2[i];}sort(nums1.begin(), nums1.end());}
};
由于是数组,不好在nums1上进行操作,既然题目没限制,就用额外空间去存,然后转到nums1上。
我写的
class Solution {
public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {int i = 0,j=0;vector<int> res;while(i!=m&&j!=n){if(nums1[i] <= nums2[j]){res.push_back(nums1[i]);i++;}else{res.push_back(nums2[j]);j++;}}if(i == m){while(j!=n){res.push_back(nums2[j++]);}}else{while(i!=m){res.push_back(nums1[i++]);}}for (int i = 0; i != m + n; ++i) {nums1[i] = res[i];}}
};力扣写的
class Solution {
public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {int p1 = 0, p2 = 0;int sorted[m + n];int cur;while (p1 < m || p2 < n) {if (p1 == m) {cur = nums2[p2++];} else if (p2 == n) {cur = nums1[p1++];} else if (nums1[p1] < nums2[p2]) {cur = nums1[p1++];} else {cur = nums2[p2++];}sorted[p1 + p2 - 1] = cur;}for (int i = 0; i != m + n; ++i) {nums1[i] = sorted[i];}}
};作者:力扣官方题解
链接:https://leetcode.cn/problems/merge-sorted-array/solutions/666608/he-bing-liang-ge-you-xu-shu-zu-by-leetco-rrb0/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。