使用双指针可能只需要遍历一趟哦(洛谷P1147题题解,Java语言描述)

好久不见. 提交于 2020-01-27 14:57:51

题目要求

P1147题目链接

在这里插入图片描述

分析

Java没有指针的概念,但我们也不是用的C的指针。这里的指针是指两个数值,代表区间的两个索引,利用双指针的移动表示区间的收缩或者扩张,借此找到所求的解。
我们定义两个int变量 i 和 j 来代表一个区间左右边界的索引
tempSum是指当前区间内所有数值的和。
当tempSum小于目标值M时,将右端点右移(j++),然后改变tempSum的值,即tempSum会变大;
当tempSum大于目标值M时,将左端点右移(i++),然后改变tempSum的值,即tempSum会变小。
在双指针移动的过程中,如果有tempSum==M的情况就将其添加到List里面,等最后输出。
因为两个指针整体是向右移动,也只扫一遍,效率比较高。
左端点大于m/2时就停止,因为只要长度为2的连续序列和就一定大于m,肯定不符合要求,不必浪费时间。
具体的设计还是需要仔细看的:

AC代码(Java语言描述)

import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int num = scanner.nextInt();
        scanner.close();
        int tempSum = 3;
        List<String> list = new LinkedList<>();
        for(int i = 1, j = 2; i <= num/2;) {
            if(tempSum == num) {
                list.add(i + " " + j);
                tempSum -= i;
                i++;
            } else if(tempSum < num) {
                j++;
                tempSum += j;
            } else {
                tempSum -= i;
                i++;
            }
        }
        for (String s : list) {
            System.out.println(s);
        }
    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!