给出了已排序和旋转元素的列表。元素按升序或降序顺序排序。例如 - 我列出了已排序的元素,如下所示
10,12,14,16,18,20,51,53,54,59
现在这个列表旋转了X次,然后看起来如下。
51,53,54,59,10,12,14,16,18,20
如果要在此列表中插入元素,那么最有效的方法是什么。
对于要插入的元素是13,如果以线性方式遍历列表,则错误插入可能发生在59到10之间。
我不期待任何代码,而是对算法的讨论是我期待的。 值21可以作为第一个/最后一个元素插入。考虑边界条件,例如 - 要插入元素,第一个和最后一个元素具有相同的值。
答案 0 :(得分:3)
这可以在log(N)时间内解决。简而言之:
关于第1点的更多信息: 假设您需要找到51,53,54,59,10,12,14,16,18,20中最大的元素。
首先你选择中间元素(假设它是12)。 12小于51,因此最大元素在12的左边。你将间隔分成两半,得到54. 54大于51,因此最大元素在54和12之间。依此类推
答案 1 :(得分:2)
当然,真正的问题是所需的数据结构和效率。
请注意,您需要了解排序,否则4,2
可以解释为:
2,4
上升并旋转一次4,2
降序从3个元素中,您可以猜测4,2,3
是上升和旋转一次,因为最大值和最小值一起设置。
实际上,您应该使用循环结构,这将使旋转变得容易。然后,您可以维护此结构的访问器:
给定最小值,很容易(与右手邻居比较)知道排序是什么。从那时起,插入圆形结构也很容易。
答案 2 :(得分:1)
跟踪X'旋转'期间的最小元素。然后在相关的一半使用二进制搜索。
答案 3 :(得分:1)
假设您的列表允许有效的随机访问,这是一个带偏移的二分搜索。如果找到了正确的索引,则将元素1索引位置向左移动。这具有搜索的复杂度O(log n)和列表复制操作的O(n)。
答案 4 :(得分:0)
我提出的一个解决方案,
1.检查边界条件,例如
如果满足上述任何条件,请在第一位插入元素。
2.取中间元素
3.元素的计算数量b / w左 - 中 OR 中右 - 基于上述条件。