求一个有序整数数组中和为K的数的对数。

求一个有序整数数组中和为K的数的对数。()
输入 :int[] arr = {1, 1, 2, 3, 4, 5, 7, 7, 8};
K=8
输出:5

思路:
解决方案:
两个指针,一个在头,一个在尾;
大则-,小则加。


/**
 * @author: xjb
 * @date: 2020/6/8
 * @description:
 **/
public class Test{
     

    public static void main(String[] args) {
     
        int[] arr = {
     1, 1, 2, 3, 4, 5, 7, 7, 8};
        System.out.println(findSumK(arr, 8));
    }

    public static int findSumK(int[] arr, int k) {
     
        if (arr == null || arr.length == 0) return 0;
        int count = 0;
        int pre = 0;
        int suf = arr.length - 1;
        while (pre < suf) {
     
            int preVal = arr[pre];
            int sufVal = arr[suf];
            int sum = preVal + sufVal;
            if (sum < k)
                pre++;
            else if (sum > k) {
     
                suf--;
            } else {
     
            	//相同处理
            	//前指针相同次数
                int preDul = 1;
                //后指针相同次数
                int sufDul = 1;
                while (arr[pre] == arr[pre + 1]) {
     
                    pre++;
                    preDul++;
                }
                while (arr[suf] == arr[suf - 1]) {
     
                    suf--;
                    sufDul++;
                }
                count += preDul * sufDul;
                pre++;
            }
        }
        return count;

    }
}

你可能感兴趣的:(java,算法)