• 和为s的两个数字VS和为s的连续正数序列


    题一:输入一个递增排序的数组和一个数字s,在数组中查找两个数,是的他们的和正好是s,如有多对,也要找出来。例如输入数组a{1,2,4,7,11,13,15},输出2,13和4,11

    思路:定义两个指针left,right,一个指针left指向数组的第一个元素,另一个right指向数组的最后一个元素,默认left为数组的第一个元素,right为数组的第最后一个元素.

    a[left]+a[right]>sum,right--

    a[left]+a[right]<sum,left++

    a[left]+a[right]=sum,打印a[left],a[right]

    题二:输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如 15=1+2+3+4+5=4+5+6=7+8

    思路:定义两个变量small,big,一个变量small初始化为1,另一个big初始化为2,初始序列为就为{1,2},序列和为3。

    int middle = (1 + sum) / 2,超过middle后面的值相加肯定比sum大,因此用它来做while循环的边界。

    当序列和小于sum时增加队列的个数,即big++;

    当序列和大于sum时,删除队列中最小的数,即small++;

    当序列和等于sum时,打印small--big之间的数,作为一组结果。

    具体参考代码如下:

    package test;
    
    import java.util.ArrayList;
    
    public class Solution {
        /**
         * 输入一个递增排序的数组和一个数字s,在数组中查找两个数,是的他们的和正好是s,如有多对,也要找出来。
         * @param sum
         * @param a
         */
        public void FindNumberWithSum(int sum, int[] a) {
            if (a == null)
                return;
            int left = 0;
            int right = a.length - 1;
            while (left < right) {
                int curSum = a[left] + a[right];
                if (curSum == sum) {
                    System.out.println(a[left] + "   " + a[right]);
                    left++;
                } else if (curSum > sum) {
                    right--;
                } else {
                    left++;
                }
            }
        }
    
        
        /**
         * 输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。
         * @param sum
         * @return
         */
        public ArrayList<ArrayList<Integer>> FindContinuousSequence(int sum) {
            ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
            if (sum < 3)
                return result;
            int small = 1;
            int big = 2;
            //超过middle后面的值相加肯定比sum大,因此用它来做while循环的边界
            int middle = (1 + sum) / 2;
            int curSum = small + big;
            while (small < middle) {
                if (curSum == sum) {
                    ArrayList<Integer> list = new ArrayList<Integer>();
                    for (int i = small; i <= big; i++) {
                        list.add(i);
                    }
                    result.add(list);
                    curSum -= small;
                    small++;
                } else if (curSum > sum) {
                    curSum -= small;
                    small++;
                } else {
                    big++;
                    curSum += big;
                }
            }
            return result;
        }
    
        @org.junit.Test
        public void TestFindContinuousSequence() {
            FindContinuousSequence(15);
        }
    
        @org.junit.Test
        public void TestFindNumberWithSum() {
            int[] a = { 1, 2, 4, 7, 11, 13, 15 };
            FindNumberWithSum(15, a);
        }
    }
  • 相关阅读:
    Codeforces Round #551 (Div. 2) F. Serval and Bonus Problem (DP/FFT)
    Codeforces Round #551 (Div. 2) E. Serval and Snake (交互题)
    BZOJ 5495: [2019省队联测]异或粽子 (trie树)
    洛谷【P2669】NOIP2015普及组 T1金币
    解决Win 10上SSD缓慢问题
    如何保障数据安全
    一个网工的linux学习过程
    JS实现select去除option的使用注意事项
    codevs1506传话(kosaraju算法)
    我的园子
  • 原文地址:https://www.cnblogs.com/tongkey/p/7943625.html
Copyright © 2020-2023  润新知