LeetCode Learning 1

第一次在林老师推荐的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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值