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

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

 

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

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

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

        }

 

点赞