665.Non-decreasing Array
- 不会调用库函数就只能缝缝补补,但下场就是内存消耗和执行用时都很大。
- c++中的is_sorted函数可以检验序列是否按规定顺序排序。用法和sort函数一样
- 这道题我没有想到的一点是遇到nums[i]>nums[i+1]的情况时,可以把nums[i]的值赋给nums[i+1]带着新序列再去判断是否符合条件。我的做法时,当遇到不符合的情况时,去找附近的点判断是否可以更改,i取了初始值为1,这样才可以随时看nums[i-1]和nums[i+1]的情况。这样反而陷入了一个较为复杂且要不断细分if else的困境中。
附上自己的代码:
class Solution {
public:
bool checkPossibility(vector<int>& nums) {
int length = nums.size()-1;
int flag=0;
for(int i=1;i<length;++i)
{
if(nums[i-1]>nums[i] && nums[i-1]>nums[i+1])
{
if(i!=1 && nums[i-2]>nums[i])
return false;
else if(i==1 && nums[i]>nums[i+1])
return false;
}
if(nums[i]<nums[i-1])
{
flag++;
if(nums[length-1]>nums[length])
flag++;
if(flag==2)
return false;
}
}
return true;
}
};
167.Two Sum II-Input array is sorted
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int l=0, r=numbers.size()-1,sum;
while(l<r)
{
sum = numbers[l] +numbers[r];
if(sum == target)
break;
else if(sum > target)
r--;
else
l++;
}
return (vector<int>{l+1,r+1});
}
};
88.Merge Sorted Array
- 虽然知道这道题让用双指针,但是还是用了一种偷懒方法,擦除掉nums1的后面几个向量,然后将nums2插入到nums1后面,最后sort函数结尾。但是只有56/59的测试用例,其中num1为[0] 0 ,nums2为[1] 1 ,除了加一个判断条件之外暂时没想到更好的解决方法。
(偷懒方法,56/59的测试用例)
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
for(auto it =nums1.end()-1;it!=nums1.begin();it--)
if(*it==0)
it = nums1.erase(it);
else if(*it!=0)
break;
for(auto num:nums2)
nums1.push_back(num);
sort(nums1.begin(),nums1.end());
}
};
2.双指针做法
三个指针,两个指向nums1(不扩充时)和nums2的结尾,一个指向扩充后nums2的结尾,然后m<n时就去比较,m中最大的元素都放完了就一直放n。
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int pos = m-- + n-- -1;
while(m>=0 && n>=0)
if(nums1[m]>nums2[n])
{
nums1[pos] = nums1[m];
--pos;
--m;
}
else
{
nums1[pos] = nums2[n];
--pos;
--n;
}
while(n>=0)
{
nums1[pos] = nums2[n];
--pos;
--n;
}
}
};