使用碰撞指针解决LeetCode问题:SortColor75,TwoSumII167,ReverseString344,reverseVowels345

本文针对TwoSumII167问题提供了解决方案,介绍了如何在已排序数组中寻找两个数使它们的和等于给定的目标值,并详细阐述了三种方法:暴力破解、二分查找以及碰撞指针法。最终推荐使用碰撞指针法,其时间复杂度为O(n),实现高效求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.TwoSumII 167问题

      题目:给定一个升序数组arr,和一个数字num。从arr中找到两个数字使其和等于num,返回这两个数的索引位置。数组中一定有解且唯一,同一个数不能使用两次。

      解答:常用的方法有三种:

  • l  最容易想到的是暴力破解。对于每一个数字num,在数组中按序遍历查找num-arr[i],缺点是没有使用到升序这一条件。时间复杂度是O(n2)
  • l  上边进行优化,可以使用二分查找搜索num-arr[i].二分法时间复杂度log(n),遍历数组是n,所以时间复杂度是nlog(n).
  • l  采用碰撞指针i j,分别指向首尾,如果arr[i]+arr[j]>num证明和太大,将j减小,使得和变小后再计算,反之将i增大之后再
代码

public class TwoSumII167
{
    public int[] twoSum(int[] arr, int num)
    {
        int i = 0;
        int j = arr.length - 1;

        while (arr[i] + arr[j] != num && j != i)
        {
            if (arr[i] + arr[j] > num)//太大了,那就把连个数字调小一点
                j--;
            else
                i++;
        }
        int[] index = new int[2];
        index[0] = i;
        index[1] = j;
        return index;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值