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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。