判断一个有序数组中是否有两个数的和等于给定的数

今天一起的同事问了一道面试的算法题,感觉很有意思,拿来和大家分享一下:

 

题目:判断一个有序数组中是否有两个数的和等于给定的数

思想很简单就是利用折半的原理,下面是我的程序和相应的注释

        /// <summary>

        /// 判断一个有序数组中是否有两个数的和等于给定的数

        /// </summary>

        /// <param name="source">已经是升序的源数组</param>

        /// <param name="sum">目标和</param>

        /// <returns>是否找到符合条件的元素</returns>

        public static bool FindSumItem(int[] source, int sum)

        {

            //算出和的一半是多大.

            int mid = sum / 2;

            //第一个数的下标.

            int i=0;

            //把数组中不大于和一半的元素做为第一个加数.

            while (i< source.Length && source[i] <= mid)

            {

                //第二个加数的下标.

                int j=i+1;

                while (j < source.Length - 1)

                {

                    //两个数的和太小,第二个加数的小标后移.

                    if(source[i] + source[j] < sum)

                    {

                        j++;

                    }

                    else

                    {

                        //两个数的刚好,返回ture.

                        if (source[i] + source[j] == sum)

                        {

                            return true;

                        }

                        else

                        {

                            //当前的第二个加数已经太大,往后移已经没有意义,跳出循环,移动第一个加数.

                            break;

                        }

                    }

                }

                //移动第一个加数.

                i++;

            }

            //一半的元素已经判断完,没有找到合适的元素,返回false.

            return false;

        }

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值