#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
void swap(int &a, int &b) {
int temp = b;
b = a;
a = temp;
}
void merge(vector<int> &nums1, int m, vector<int> &nums2, int n) {
int i , j;
for (i = 0, j = 0; i < m && n > 0 && j < n; i++) {
if (nums1[i] > nums2[j]) {
int mi = m;
while(mi > i)
{//s1[i] > s2[j] 全部往后移动一个,插入s2[j]
nums1[mi] = nums1[mi-1];
mi--;
}
m = m+1;
nums1[i] = nums2[j];
j++;
}
}
//s1 当前元素都小于 s2 把s2 补充进来
while (j < n ) {
nums1[i++] = nums2[j];
j++;
}
}
void merge2(vector<int> &nums1, int m, vector<int> &nums2, int n)
{
int i = m+n-1;
m--;
n--;
while(n >= 0)
{
while(m>=0 && nums1[m] > nums2[n])
{
swap(nums1[i--],nums1[m--]);
}
swap(nums1[i--], nums2[n--]);
}
}
void merge3(vector<int> &nums1, int m, vector<int> &nums2, int n)
{
int i = m-1, j = n-1, s1 = m+n-1;
while(s1 >= 0 && i >= 0 && j >= 0)
{
if(nums1[i] > nums2[j])
{
nums1[s1] = nums1[i];
i--;
}
else
{
nums1[s1] = nums2[j];
j--;
}
s1--;
}
while(j >= 0 && s1 >= 0)
{
nums1[s1] = nums2[j];
s1--;
j--;
}
}
};
int main() {
vector<int> nums1 = {2,0};
vector<int> nums2 = {1};
int m = 1;
int n = 1;
Solution sol;
sol.merge3(nums1, m, nums2, n);
for (int i = 0; i < n + m; i++) {
cout << nums1[i] << " ";
}
return 0;
}
class Solution {
public:
//笨方法时间有点长
int removeElement(vector<int> &nums, int val) {
for (vector<int>::iterator it = nums.begin(); it != nums.end();) {
if (*it == val)
nums.erase(it);
else
it++;
}
return nums.size();
}
//左右指针解法
int removeElement1(vector<int> &nums, int val) {
int left = 0, right = 0;
for (right = 0; right < nums.size(); right++) {
if (nums[right] != val) {
nums[left] = nums[right];
left++;
}
}
return left;
}
//左右指针优化
int removeElement2(vector<int> &nums, int val) {
int left = 0, right = nums.size();
while (left < right) {
if (nums[left] == val) {
nums[left] = nums[right - 1];
right--;
} else {
left++;
}
}
return left;
}
};