实践题目:
设a[0:n-1]是已排好序的数组,请改写二分搜索算法,使得当x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。
输入格式:
输入有两行:
第一行是n值和x值; 第二行是n个不相同的整数组成的非降序序列,每个整数之间以空格分隔。
输出格式:
输出小于x的最大元素的最大下标i和大于x的最小元素的最小下标j。当搜索元素在数组中时,i和j相同。 提示:若x小于全部数值,则输出:-1 0 若x大于全部数值,则输出:n-1的值 n的值
问题描述:
这道题除了用二分搜索找出数组中的数输出其下标,还需要考虑当x不在数组中的情况,输出其相邻的下标。
算法描述:采用二分搜索算法。检索x是否在数组中,使用递归调用,若目标数大于中位数递归右半部分,小于中位数则递归左半部分。接着判断x是否在数组中,若在,则输出两次其坐标,不在则输出其相邻的下标。
算法时间及空间复杂度分析:
在二分搜索算法中,不断递归直至找到为止。每次递归就是n/2。所以时间复杂度为O(logn)
空间复杂度为O(n)
心得体会:在做题前要有一个指导思想。首先要熟悉掌握书上的代码,通过其核心的思路解决不一样的问题。有时要精简自己的代码,不然会显得繁琐,可读性也会下降。全面思考一道题,需要考虑多种情况,善于运用判断语句。在小组合作的过程中,两个人的交流能够更有效率完成题目。思路的不同有时会促进思考,在讨论的过程中收获了知识,也看到自己的不足。