88. 合并两个有序数组
新建一个数组的方法
空间复杂度m+n
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int sort[m+n];
int i = 0, j = 0, k = 0;
while(i < m || j < n)
{
if(i >= m)
{
sort[k++] = nums2[j++];
}
else if(j >= n)
{
sort[k++] = nums1[i++];
}
else if(nums1[i]>nums2[j])
{
sort[k++] = nums2[j++];
}
else
{
sort[k++] = nums1[i++];
}
}
i = 0, j = 0;
while(i < m+n)
{
nums1[i++] = sort[j++];
}
}
};
优化:倒序判断谁大直接放nums1
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int sort[m+n];
int i = m-1, j = n-1, k = n+m-1;
while(i >= 0 || j >= 0)
{
if(i == -1)
{
nums1[k--] = nums2[j--];
}
else if(j == -1)
{
nums1[k--] = nums1[i--];
}
else if(nums1[i] < nums2[j])
{
nums1[k--] = nums2[j--];
}
else
{
nums1[k--] = nums1[i--];
}
}
}
};
15. 三数之和
暴力方法:
排序使用冒泡,两次遍历
排序算法可以优化
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
int n = nums.size();//数组长度
vector<vector<int>> ans;
//冒泡
for(int i = 0; i < n; i++)
{
for(int j = i+1; j < n; j++)
{
if(nums[i] > nums[j])
{
swap(nums[i], nums[j]);
}
}
}
for(int i = 0; i < n; i++)
{
if(nums[i] > 0) break;//最小数大于0,不可能三数之和为0,退出循环
if(i > 0 && nums[i] == nums[i-1]) continue; //防止重复
int k = n-1;
int target = -nums[i];
for(int j = i+1; j < n; j++)
{
if(j > i+1 && nums[j] == nums[j-1]) continue;//去重
while(j < k && nums[j] + nums[k] > target)
{
k--;
if(nums[k] < 0)
break;
}
if(j == k)
{
break;
}
if(nums[j] + nums[k] == target)
{
ans.push_back({nums[i], nums[j], nums[k]});
}
}
}
return ans;
}
};