leetcode 双指针

leetcode双指针

Question1(leetcode 283):

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

class Solution {
    public void moveZeroes(int[] nums) {
        for(int i=0;i<nums.length-1;i++)
        {
            for(int j=0;j<nums.length-i-1;j++)
            {
                if(nums[j]==0)
                {
                    int temp=nums[j];
                    nums[j]=nums[j+1];
                    nums[j+1]=temp;
                }
            }
            
        }
        return ;


    }
}

执行用时:64 ms, 在所有 Java 提交中击败了5.17%的用户
内存消耗:38.7 MB, 在所有 Java 提交中击败了42.95%的用户

采用冒泡排序进行处理。比较复杂

class Solution {
    public void moveZeroes(int[] nums) {
        int n = nums.length, left = 0, right = 0;
        while (right < n) {
            if (nums[right] != 0) {
                swap(nums, left, right);
                left++;
            }
            right++;
        }
    }

    public void swap(int[] nums, int left, int right) {
        int temp = nums[left];
        nums[left] = nums[right];
        nums[right] = temp;
    }
}

采用双指针的方法,把右侧的指针对应的非零数依次移动到左指针。
执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:38.4 MB, 在所有 Java 提交中击败了85.82%的用户

Question2(leetcode 167):

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

class Solution {
    public int[] twoSum(int[] numbers, int target) {
        for(int i=1;i<=numbers.length;i++)
        {
            for(int j=i+1;j<=numbers.length;j++)
            {
                if(numbers[i-1]+numbers[j-1]==target)
                return new int[]{i,j};
            }

        }
        return new int[]{-1,-1};
    }
}

执行用时:233 ms, 在所有 Java 提交中击败了6.64%的用户
内存消耗:38.9 MB, 在所有 Java 提交中击败了7.23%的用户

总结:这个算法时间复杂度为O(n^2),

class Solution {
    public int[] twoSum(int[] numbers, int target) {
        
        int q=1;
        while(q<numbers.length)
        {
            int p=0;
            if(numbers[p]+numbers[q]==target)
            {
                return new int[]{p+1,q+1};
            }
            while(numbers[q]+numbers[p]<=target&&p+1<q)
            {
                p++;
                if(numbers[p]+numbers[q]==target)
                return new int[]{p+1,q+1};
                
            }
            q++;
        }
        return new int[]{-1,-1};


    }
}

执行用时:102 ms, 在所有 Java 提交中击败了11.46%的用户
内存消耗:38.3 MB, 在所有 Java 提交中击败了94.81%的用户

利用双指针,但设计或许不够好,执行用时没有显著提升。

查看答案得:

在这里插入代码片
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值