LeetCode Learning 1

来源:互联网 发布:sas聚类分析共现矩阵 编辑:程序博客网 时间:2024/05/22 06:37

第一次在林老师推荐的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;}};

0 0
原创粉丝点击