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

来源:互联网 发布:ep软件 编辑:程序博客网 时间:2024/06/05 14:31

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;    }}


原创粉丝点击