Leetcode刷题Day3(C#)

283、移动零

题目描述:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

解题:

看到这题也需要用双指针来做,我果断地想到了设置left和right两个指针,原理也很简单:

 但是在代码编写的过程中,不停地有溢出的情况,我一怒之下,一步一检验,最终代码如下:

public class Solution {
    public void MoveZeroes(int[] nums) {
        int left = 0;
        int right = 0;
        while(left<nums.Length && right<nums.Length){
           for(int i = 0;left<nums.Length;i++){
               if(nums[left]!=0){
                   left +=1 ;
               }
               else break;
           }
           right = left;
           for(int j = 0;right<nums.Length;j++){
               if(nums[right]==0){
                   right +=1 ;
               }
               else break;
           }
           if(left<nums.Length&&right<nums.Length){
               nums[left]=nums[right];
               nums[right]=0;  
           }
        }
    }
}

最终的结果:

 167、两数之和 II - 输入有序数组

题目描述:

给定一个已按照 非递减顺序排列  的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。

函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。

你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路也是两个指针i和j,一个从头开始,一个从尾开始,计算numbers[i]+numbers[j]的值

代码如下:

public class Solution {
    public int[] TwoSum(int[] numbers, int target) {
        int[] Index = new int[2];
        for(int i = 0;i<numbers.Length;i++){
            for(int j = numbers.Length-1;j>i;j--){
                if(numbers[i]+numbers[j]==target){
                    Index[0] = i+1;
                    Index[1] = j+1;
                    j=i-1;
                    i = numbers.Length;
                    break;
                }
                if(numbers[i]+numbers[j]<target){
                    j=i-1;
                }
            }
        }
        return Index;
    }
}

这个代码的结果却不是很好:

 看了一下解析才发现自己真傻,双指针明明可以更简单。

上一段代码是每次固定一个值,然后遍历剩下的数组找另外一个值,这样时间当然多了,找的时候明明可以用二分找啊

既然用双指针,其实就可以大了右指针左移一位,小了左指针右移一位

这种方法的代码如下:

public class Solution {
    public int[] TwoSum(int[] numbers, int target) {
        int[] Index = new int[2];
        int left = 0;
        int right = numbers.Length-1;
        while(left<=right){
            if (numbers[left]+numbers[right]<target){
                left++;
            }
            else if(numbers[left]+numbers[right]>target){
                right--;
            }
            else{
                Index[0] = left+1;
                Index[1] = right+1;
                break;
            }
        }
        return Index;
    }
}

结果果然快了很多

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值