class Solution {
public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {vector<int> res;int p = 0; //对nums1的指针int q = 0; //对nums2的指针int r = 0; //对res的指针while(p < m && q < n){if(nums1[p] < nums2[q]) //nums1更小,nums1先放res.push_back(nums1[p++]);elseres.push_back(nums2[q++]);}if(p < m) //nums1还有剩//将p到m-1移到最后几位for(int i = m - 1; i >= p; i--)nums1[n + i] = nums1[i];if(q < n) //nums2还有剩//将q到n-1移到最后几位for(int i = n - 1; i >= q; i--)nums1[m + i] = nums2[i];for(int i = 0; i < (int)res.size(); i++)nums1[i] = res[i];}
};
89. 格雷编码
自己做
解:递归分治
class Solution {
public:vector<int> grayCode(int n) {if(n == 1)return vector<int>{0, 1};int num = 1;for(int i = 0; i < n; i++)num *= 2;vector<int> res(num);//前num / 2位vector<int> last_res = grayCode(n - 1); //上回的结果for(int i = 0; i < num / 2; i++)res[i] = last_res[i];//后num / 2位for(int i = num / 2; i < num; i++)res[i] = last_res[num - i - 1] + num / 2;return res;}
};