`
OpenMind
  • 浏览: 179837 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

二分搜索专题1-在非递减数组中寻找满足A[i]=i的i

 
阅读更多
在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]的区间

欢迎网友的指导。
分享到:
评论
6 楼 beck5859509 2013-09-25  
这个只能搜到一个,题目中如果数组中存在多个a[j]=j的情况不满足。
5 楼 unique.wu 2013-09-25  
排序好的数组,不用二分法,用什么,任意类型都可以的啊,只要能够比较。。
4 楼 414149609 2013-09-23  
OpenMind 写道
我这篇博客有点问题,要改成递增(而不是非递减)数列就没有问题。

刚才写错了
public static double[] ff = new double[] { -1, -0.9, -0.6, 0, 0.2, 0.3, 6, 6.1, 6.2, 6.3, 6.4, 11, 11.1, 11.2, 14, 16, 17, 17.1, 18.2, 19 };
3 楼 414149609 2013-09-23  
OpenMind 写道
我这篇博客有点问题,要改成递增(而不是非递减)数列就没有问题。


拿A[n]=m的情况来说,你如何抛掉那些不可能的区间

比如就这个例子
public static double[] ff = new double[] { -1, -0.9, -0.6, 0, 0.2, 0.3, 6,   
3.        6.1, 6.2, 6.3, 6.4, 11, 11.1, 11.2, 14, 16, 17, 17.1, 18.2, 19 };


如果你的第一次落的点在11里面, 你要抛掉后面还是前面的?? 无论前面还是后面都会有
n>m , n<m ,n=m的情况
2 楼 OpenMind 2013-09-23  
我这篇博客有点问题,要改成递增(而不是非递减)数列就没有问题。
1 楼 414149609 2013-09-23  

	// 6,11,14,19   注意:从14之后开始,"下标"是是小于"内容",但是最终在19相等了
	public static double[] ff = new double[] { -1, -0.9, -0.6, 0, 0.2, 0.3, 6,
			6.1, 6.2, 6.3, 6.4, 11, 11.1, 11.2, 14, 16, 17, 17.1, 18.2, 19 };


这个问题,二分法貌似不太适用,
用二分法,无法是在 A[n]=m  ; n>m 或者 n<m之间找区间,

但是看上面的这个数组.上面的数组会在6,11,14,19的时候出现 n=m的情况

n<=14以前,都是n>=m;
但是到了   14<n<=19 这个区间,都是n<=m的.

所以区间法(二分法)不靠谱.

所以我觉得用hash比较靠谱

相关推荐

    Python算法题源代码-LeetCode(力扣)-在排序数组中查找元素的第一个和最后一个位置

    如果数组中不存在目标值 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

    给定一个长度为 n 的整数数组,你的任务是判断在最多改变 1 个元 素的情况下,该数组能否变成一个非递减数列。非递减数列定义如下:对 于数组中所有的 i (1 &lt;= i ),满足 array[i] &lt;= array[i + 1]

    c语言编程题之数组操作非递减序列.zip

    - 为了检查数组是否为非递减序列,可以比较相邻的元素,如`if(arr[i] &gt; arr[i+1])`,如果满足条件,说明序列不是非递减的。 - 可以通过双指针方法,一个指针从前往后扫描,另一个指针从后往前扫描,如果前指针找到...

    二维数组专题总结

    ### 二维数组专题总结 #### 一、遍历打印输出二维数组的元素 在C语言中,二维数组是一种特殊的数据结构,它允许我们存储多维数据。例如,一个`3x3`的二维数组可以用来表示一个3行3列的矩阵。 **代码示例:** ```...

    折半查找非递减数组的区间

    输入两个数,查找位于位于这两数区间的序列

    两个升序的数组A、B,将AB合并到C,保持升序,去除重生的元素

    本问题涉及的是两个已按升序排列的整数数组A和B的合并,目标是将它们合并到一个新的数组C中,同时确保C也按升序排列,并且在合并过程中去除重复的元素。下面将详细探讨这个过程的实现方法。 首先,我们要明确合并两...

    数组与指针详解

    数组和指针是C/C++编程语言中的两个核心概念,它们在程序设计中扮演着至关重要的角色。数组是一组相同类型的元素集合,而指针则是存储内存地址的变量,可以用来间接访问这些元素。理解它们之间的关系对于编写高效且...

    c++-c++编程基础之leetcode题解第34题在排序数组中查找元素的第一个和最后一个位置.zip

    在这个问题中,我们学习了如何在C++中使用数组和循环,以及如何实现二分查找算法。同时,这道题也考察了边界条件的处理,如当数组中没有目标元素时,需要返回{-1, -1}。 总的来说,解决LeetCode上的第34题能够帮助...

    再再论指针-分析指针与数组的好文

    例如,二维数组在内存中是连续存储的,可以视为一维数组的数组。因此,二维数组的每个元素实际上是一个一维数组的地址,但这个地址不是指针,而是数组的起始位置。当我们传递二维数组给函数时,函数接收的是指向数组...

    山脉数组的峰顶索引(二分查找)1

    标题中的“山脉数组的峰顶索引(二分查找)1”指的是在计算机科学和算法设计中,如何在一个特殊的数组结构——山脉数组中找到峰值元素的索引,使用二分查找算法来提高效率。这个题目来自LeetCode,一个在线编程挑战...

    MATLAB-数组循环赋值.docx

    在MATLAB中,循环结构是处理数组数据的重要工具,它允许我们遍历数组的每一个元素并执行特定的操作,如赋值。本节将详细介绍如何使用`for`和`while`循环来实现数组的循环赋值。 1. **使用for循环对数组赋值** `...

    山脉数组中查找目标值(找峰值两侧二分查找)1

    二分查找通常用于在有序数组中查找目标值,但在这个问题中,由于山脉数组的特性,我们需要对峰值左右两侧分别进行二分查找。 首先,我们需要找到山脉数组的峰值,也就是数组中最大的元素所在的索引。我们可以通过一...

    两数之和 II - 输入有序数组python1

    这是一个基于数组的搜索问题,其中数组已经按非递减顺序排列,目的是找到两个数的索引,使得它们的和等于一个特定的目标数。问题的关键在于利用数组的有序性来优化解决方案,提高效率。 首先,我们要理解问题的要求...

    Java基础--数组练习1(让你醍醐灌顶!!!)

    在Java编程语言中,数组是一种非常基础且重要的数据结构,它允许程序员存储多个同类型的数据。在本文中,我们将通过两个案例来深入理解和练习Java数组的使用。 案例一的目标是创建一个数组,用于存储1到100之间的...

    两个非递减存储顺序线性表归并为非递减顺序线性表

    本文主要介绍数据结构中线性表的实现和归并,通过编写程序,建立两个非递减存储的顺序线性表,并将其归并为一个非递减顺序的线性表。 线性表的定义和实现 线性表是一种基本的数据结构,指的是元素类型相同、各元素...

    两数之和 - 输入有序数组

    给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 &lt;= index1 ...

    手稿_V1.0137

    例如,数组[4, 2, 3]在改变第一个4为1后,可以满足非递减条件,而数组[4, 2, 1]则无法在只改变一个元素的情况下变为非递减数组。 解决这个问题的一种常见策略是暴力法,即遍历数组,统计不满足非递减条件的元素个数...

    有效的山脉数组1

    - 在找到索引 `i` 后,数组开始递减(A[i] &gt; A[i+1] &gt; ... &gt; A[A.length - 1])。 给定的代码中,我们有两个指针 `left` 和 `right`。`left` 从数组的左侧开始,寻找上升部分的末尾,即山峰的左侧;而 `right` 从...

    js-leetcode题解之两个数组的交集II-题解.zip

    2. **二分查找**(Binary Search):对于nums2中的每一个元素,我们使用二分查找法在nums1中查找是否存在相同的元素。二分查找能将搜索时间复杂度降低到O(log n)。 3. **哈希表**(Hash Table):为了存储每个元素...

    非递减数列判断1

    当`low`和`high`相遇时,我们检查在它们相遇的过程中是否只出现了一次失序(即相邻元素不满足非递减关系)。如果有且仅有一次失序,我们可以通过调整这个位置的元素使得数组成为非递减数列。 在移动指针的过程中,...

Global site tag (gtag.js) - Google Analytics