第一次在林老师推荐的LeetCode这个网站上做题。先挑了通过率比较高的简单题和中等题来尝试。
首先第一题是283.Move Zeroes。这是一道难度为Easy的题,只需要把一个数组中的0都移到最后,其它数字的顺序不变,而且题目还有一个要求是只用当前数组进行变换而不能copy一个新的数组来操作。我的解决方法就是从后往前找0,找到以后把后边的数都向前挪一位,再把0放到最后。代码如下:
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int noz = 0;
for (int i = nums.size() - 2; i != -1; i--){
if (nums[i] == 0){
for (int j = i; j<nums.size() - 1 - noz; j++){
nums[j] = nums[j + 1];
}
nums[nums.size() - 1 - noz] = 0;
noz++;
}
}
}
};
第二题是167.Two SumⅡ。难度为Medium。给定一个排好序的整数数组和一个目标整数,找出数组中2个整数的和为目标整数,输出那2个数的位置。题目已经设定每样例只有一个解。如果数组没有排序则需要把每对整数进行检验,这样会是O(n^2)的复杂度,一开始我没有注意已经排序,用了这个算法发现超时。排好序的话可以先确定一个x1,然后用二分查找去查找x2=(目标-x1)。这样就能达到O(N logN)的复杂度。代码如下:
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int ns = numbers.size();
vector<int> res;
for (int i = 0; i<ns&&numbers[i] <= target / 2; i++){
int l = i + 1, r = ns - 1, j, ta = target - numbers[i];
while (l <= r){
j = l + (r - l) / 2;
if (ta < numbers[j])r = j - 1;
else if (ta > numbers[j])l = j+1;
else {
res.push_back(i+1);
res.push_back(j+1);
return res;
}
}
}
return res;
}
};