在javaeye上看到了一个二分搜索相关的提问http://www.iteye.com/topic/1118606,我设计了一个简洁高效的算法,这里贴出来:
题目:对于一个非递减数组A,存在A[i]=i,求o(lgn)的算法找出i,
分析:
1,对于任意的j和i,如果j>i则A[j]>=A[i];
2,假设所求的解是I,即A[I]=I,则对任意的j,如果A[j]>j,可以得到I<j,如果A[j]<j,则j<I,如果A[j]=j,则j=I(不考虑I的多解情况).
利用2可以得到下面的算法:
public static int search(int[] A) {
int len = A.length;
int start = 0;
int end = len;
while (start <= end) {
int j = (start + end) / 2;
if (A[j] == j) {
return j;
}
if (A[j] > j) {
end = j - 1;
} else if (A[j] < j) {
start = j + 1;
}
}
return -1;
}
解析:
当A[j]>j时,抛弃[j,end]的区间,当A[j]<j时,抛弃[start,j]的区间
欢迎网友的指导。
分享到:
相关推荐
如果数组中不存在目标值 target,返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 示例 1: 输入:nums = [5,7,7,8,8,10], target = 8 输出:[3,4] 示例 2: 输入:nums = [5,7,7,8,8...
给定一个长度为 n 的整数数组,你的任务是判断在最多改变 1 个元 素的情况下,该数组能否变成一个非递减数列。非递减数列定义如下:对 于数组中所有的 i (1 <= i ),满足 array[i] <= array[i + 1]
- 为了检查数组是否为非递减序列,可以比较相邻的元素,如`if(arr[i] > arr[i+1])`,如果满足条件,说明序列不是非递减的。 - 可以通过双指针方法,一个指针从前往后扫描,另一个指针从后往前扫描,如果前指针找到...
### 二维数组专题总结 #### 一、遍历打印输出二维数组的元素 在C语言中,二维数组是一种特殊的数据结构,它允许我们存储多维数据。例如,一个`3x3`的二维数组可以用来表示一个3行3列的矩阵。 **代码示例:** ```...
输入两个数,查找位于位于这两数区间的序列
本问题涉及的是两个已按升序排列的整数数组A和B的合并,目标是将它们合并到一个新的数组C中,同时确保C也按升序排列,并且在合并过程中去除重复的元素。下面将详细探讨这个过程的实现方法。 首先,我们要明确合并两...
数组和指针是C/C++编程语言中的两个核心概念,它们在程序设计中扮演着至关重要的角色。数组是一组相同类型的元素集合,而指针则是存储内存地址的变量,可以用来间接访问这些元素。理解它们之间的关系对于编写高效且...
在这个问题中,我们学习了如何在C++中使用数组和循环,以及如何实现二分查找算法。同时,这道题也考察了边界条件的处理,如当数组中没有目标元素时,需要返回{-1, -1}。 总的来说,解决LeetCode上的第34题能够帮助...
例如,二维数组在内存中是连续存储的,可以视为一维数组的数组。因此,二维数组的每个元素实际上是一个一维数组的地址,但这个地址不是指针,而是数组的起始位置。当我们传递二维数组给函数时,函数接收的是指向数组...
标题中的“山脉数组的峰顶索引(二分查找)1”指的是在计算机科学和算法设计中,如何在一个特殊的数组结构——山脉数组中找到峰值元素的索引,使用二分查找算法来提高效率。这个题目来自LeetCode,一个在线编程挑战...
在MATLAB中,循环结构是处理数组数据的重要工具,它允许我们遍历数组的每一个元素并执行特定的操作,如赋值。本节将详细介绍如何使用`for`和`while`循环来实现数组的循环赋值。 1. **使用for循环对数组赋值** `...
二分查找通常用于在有序数组中查找目标值,但在这个问题中,由于山脉数组的特性,我们需要对峰值左右两侧分别进行二分查找。 首先,我们需要找到山脉数组的峰值,也就是数组中最大的元素所在的索引。我们可以通过一...
这是一个基于数组的搜索问题,其中数组已经按非递减顺序排列,目的是找到两个数的索引,使得它们的和等于一个特定的目标数。问题的关键在于利用数组的有序性来优化解决方案,提高效率。 首先,我们要理解问题的要求...
在Java编程语言中,数组是一种非常基础且重要的数据结构,它允许程序员存储多个同类型的数据。在本文中,我们将通过两个案例来深入理解和练习Java数组的使用。 案例一的目标是创建一个数组,用于存储1到100之间的...
本文主要介绍数据结构中线性表的实现和归并,通过编写程序,建立两个非递减存储的顺序线性表,并将其归并为一个非递减顺序的线性表。 线性表的定义和实现 线性表是一种基本的数据结构,指的是元素类型相同、各元素...
给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 ...
例如,数组[4, 2, 3]在改变第一个4为1后,可以满足非递减条件,而数组[4, 2, 1]则无法在只改变一个元素的情况下变为非递减数组。 解决这个问题的一种常见策略是暴力法,即遍历数组,统计不满足非递减条件的元素个数...
- 在找到索引 `i` 后,数组开始递减(A[i] > A[i+1] > ... > A[A.length - 1])。 给定的代码中,我们有两个指针 `left` 和 `right`。`left` 从数组的左侧开始,寻找上升部分的末尾,即山峰的左侧;而 `right` 从...
2. **二分查找**(Binary Search):对于nums2中的每一个元素,我们使用二分查找法在nums1中查找是否存在相同的元素。二分查找能将搜索时间复杂度降低到O(log n)。 3. **哈希表**(Hash Table):为了存储每个元素...
当`low`和`high`相遇时,我们检查在它们相遇的过程中是否只出现了一次失序(即相邻元素不满足非递减关系)。如果有且仅有一次失序,我们可以通过调整这个位置的元素使得数组成为非递减数列。 在移动指针的过程中,...