二分查找

【Java】 二分查找算法(递归+循环)

匿名 (未验证) 提交于 2019-12-02 21:52:03
1. 二分查找算法――循环 public static int search ( int [] arr , int k ){ int start = 0 ; int end = arr . length - 1 ; while ( start <= end ){ int mid =( start + end )/ 2 ; if ( arr [ mid ]== k ) return mid ; else if ( arr [ mid ]> k ) end = mid - 1 ; else start = mid + 1 ; } return - 1 ; } 2. 二分查找算法――递归 public static int search2 ( int [] arr , int k , int start , int end ){ if ( start > end ) return - 1 ; int mid =( start + end )/ 2 ; if ( arr [ mid ]== k ) return mid ; else if ( arr [ mid ]> k ){ return search2 ( arr , k , start , mid - 1 ); } else { return search2 ( arr , k , mid + 1 , end ); } } 测试:

二分查找(二)

醉酒当歌 提交于 2019-12-02 20:28:27
【找到 K 个最接近的元素】 给定一个排序好的数组,两个整数 k 和 x,从数组中找到最靠近 x(两数之差最小)的 k 个数。返回的结果必须要是按升序排好的。如果有两个数与 x 的差值一样,优先选择数值较小的那个数。 示例 1: 输入: [1,2,3,4,5], k=4, x=3 输出: [1,2,3,4] 示例 2: 输入: [1,2,3,4,5], k=4, x=-1 输出: [1,2,3,4] 链接:https://leetcode-cn.com/problems/find-k-closest-elements def findClosestElements(self, arr, k, x): """ :type arr: List[int] :type k: int :type x: int :rtype: List[int] """ # 查找>=目标值 def find_target(arr, target): left = 0 right = len(arr) - 1 while left <= right: mid = (left + right) // 2 if target > arr[mid]: left = mid + 1 else: right = mid - 1 return left index = find_target(arr, x) left,

LeetCode解题汇总目录

a 夏天 提交于 2019-12-02 17:37:52
此篇为学习完 《数据结构与算法之美》 后,在 LeetCode 刷题的汇总目录,方便大家查找(Ctrl+F ind ),一起刷题,一起PK交流!Updated on 2019.12.2 刷题可以按照 不同的专题 进行,便于加强某个知识点的理解。 我的 LeetCode 主页 我的 GitHub 主页 已解决 519/1185 - 简单 281 中等 208 困难 30 2019.7.24 - 2019.11.9,108天做了400道题 2019.11.9 - 2019.11.24, AC+100道,4个月共计500道题 参赛记录 LeetCode 2019 力扣杯全国秋季编程大赛 ​ 已解题目,部分太简单的没有列出 LeetCode 1. 两数之和(哈希) LeetCode 2. 两数相加(单链表反转) LeetCode 3. 无重复字符的最长子串(滑动窗口+哈希) LeetCode 4. 寻找两个有序数组的中位数(二分查找,难) LeetCode 7. 整数反转 LeetCode 8. 字符串转换整数 (atoi) LeetCode 9. 回文数 LeetCode 11. 盛最多水的容器(双指针) LeetCode 14. 最长公共前缀 LeetCode 15. 三数之和 LeetCode 16. 最接近的三数之和(固定左端+滑动窗口) LeetCode 17.

python几种排序算法和二分查找方法的实现

久未见 提交于 2019-12-02 17:02:59
一.算法概念 - 含义:算法就是对问题进行处理且求解的一种实现思路或者思想。 评判程序优劣的方法 - 消耗计算机资源和执行效率(无法直观) 计算算法执行的耗时(不推荐,因为会受机器和执行环境的影响) 时间复杂度(推荐) 时间复杂度 - 评判规则:量化算法执行的操作/执行步骤的数量, - 如下列 def sumOfN(n): # 执行一步: theSum = 0 for i in range(1,n+1): # 下式一共执行n步,for循环不算一步,因为它是控制循环次数的 theSum = theSum + i # return又执行一步 return theSum # 调用函数,计算执行步骤为:n+2 sumOfN(10) - 最重要的项:时间复杂度表达式中最有意义的项 - 使用大O记法来表示时间复杂度 O(最重要的项) # 如上式:最有意义的项就是n,所以n+2 ==>O(n) 常见的时间复杂度: O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n) 数据结构 - 概念: 对于数据(基本类型的数据(int,float,char))的组织方式就被称作为数据结构。数据结构解决的就是一组数据如何进行保存,保存形式是怎样的。 - 使用不同的形式组织数据,在基于查询时的时间复杂度是不一样的

二分查找

痴心易碎 提交于 2019-12-02 16:28:07
二分查找 纯在了很久的问题了,一直有一点弄不明白。现在应该搞懂了。 主要是查找我们说要的值在那个位置上 代码: int l=上届,r=下届; while(l<=r) { int mid=(l+r)>>1; if(a[mid](这个位置上的值大小号数什么的)<目标的值大小号数什么的) l=mid+1; else r=mid-1; } 应为是< 所以 l 这个位置 所代表的值一定(有解就==)没有接就是 >一个 记住了 来个例题: 题目: 问题 A: 斐波那契数列 时间限制: 1 Sec 内存限制: 128 MB 提交: 4 解决: 4 [提交] [状态] [讨论版] [命题人:xingxing] 题目描述 小 C 养了一些很可爱的兔子。 有一天,小 C 突然发现兔子们都是严格按照伟大的数学家斐波那契提出的模型来进行 繁衍:一对兔子从出生后第二个月起,每个月刚开始的时候都会产下一对小兔子。我们假定, 在整个过程中兔子不会出现任何意外。 小 C 把兔子按出生顺序,把兔子们从 1 开始标号,并且小 C 的兔子都是 1 号兔子和 1 号兔子的后代。如果某两对兔子是同时出生的,那么小 C 会将父母标号更小的一对优先标 号。 如果我们把这种关系用图画下来,前六个月大概就是这样的: 其中,一个箭头 输入 输入第一行,包含一个正整数 输出 输入一共 样例输入 Copy 5 1 1 2 3 5 7 7

JAVA数据结构和算法 2-数组

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-02 16:07:33
数组中使用的主要算法:插入、查找(线性查找-无序/二分查找-有序)、删除 在JAVA中数组属于对象类型: 1、创建方法有3种:      或者   数组一旦创建,大小不可改变。数组大小可以通过length字段获得:int arrayLength = intArray.length;    2、初始化方法:数组创建后,如果不被赋值,数组的数据项将一直是null对象。   数组可以在创建的同时就对其赋值,如:      也可以在创建后对其进行赋值:新数据项仅简单地插在数组中的第一个可用空位,且算法知道插入空位的具体位置:       3、插入和删除    无序数组插入:在数组的第一个可用空位插入数据,直接插入。    有序数组插入:在需要首先 查找 正确的插入位置,然后把该位置及其后的元素后移,再在空位上插入 。   删除:删除需要首先 查找 到所删数据的位置,然后把该位置后的所有数据依次前移一位。   4、查找   有序数组二分查找       5、时间复杂度       表2.1中为无序数组的操作次数,二分查找的比较次数为log2(N)。          来源: https://www.cnblogs.com/lsh0908/p/11752625.html

14. 二分查找

ⅰ亾dé卋堺 提交于 2019-12-02 15:09:05
给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1。 样例 样例 1: 输入:[1,4,4,5,7,7,8,9,9,10],1 输出: 0 样例解释: 第一次出现在第0个位置。 样例 2: 输入: [1, 2, 3, 3, 4, 5, 10],3 输出: 2 样例解释: 第一次出现在第2个位置 样例 3: 输入: [1, 2, 3, 3, 4, 5, 10],6 输出: -1 样例解释: 没有出现过6, 返回-1 挑战 如果数组中的整数个数超过了2^32,你的算法是否会出错? 我自己写的 public class Solution { /** * @param nums: The integer array. * @param target: Target to find. * @return: The first position of target. Position starts from 0. */ public int binarySearch(int[] nums, int target) { // write your code here int ret = -1; int start = 0; int end = nums.length; int

【转载】二分查找算法细节详解

天涯浪子 提交于 2019-12-02 14:37:58
文章出处: 二分查找算法细节详解 思路 我相信对很多读者朋友来说,编写二分查找的算法代码属于玄学编程,虽然看起来很简单,就是会出错,要么会漏个等号,要么少加个 1。 不要气馁,因为二分查找其实并不简单。看看 Knuth 大佬(发明 KMP 算法的那位)怎么说的: Although the basic idea of binary search is comparatively straightforward, the details can be surprisingly tricky... 这句话可以这样理解: 思路很简单,细节是魔鬼。 本文以问答的形式,探究几个最常用的二分查找场景:寻找一个数、寻找左侧边界、寻找右侧边界。第一个场景是最简单的算法形式,解决 这道题 ,后两个场景就是本题。 而且,我们就是要深入细节,比如不等号是否应该带等号,mid 是否应该加一等等。分析这些细节的差异以及出现这些差异的原因,保证你能灵活准确地写出正确的二分查找算法。 零、二分查找框架 int binarySearch ( int [ ] nums , int target ) { int left = 0 , right = . . . ; while ( . . . ) { int mid = ( right + left ) / 2 ; if ( nums [ mid ] == target

二分查找

自作多情 提交于 2019-12-02 13:17:57
最全的二分查找模板请到: https://blog.csdn.net/qq_19446965/article/details/82184672 【题目1】 在一个排序数组中找一个数,返回该数出现的任意位置,如果不存在,返回 -1 。 样例 1: 输入:nums = [1,2,2,4,5,5], target = 2 输出:1 或者 2 样例 2: 输入:nums = [1,2,2,4,5,5], target = 6 输出:-1 class Solution: """ @param nums: An integer array sorted in ascending order @param target: An integer @return: An integer """ def findPosition(self, nums, target): # write your code here left = 0 right = len(nums) - 1 while left <= right: mid = left + (right - left)//2 if nums[mid] == target: return mid elif target > nums[mid]: left = mid + 1 else: right = mid - 1 return -1 【题目2】

二分查找&二分答案

不羁的心 提交于 2019-12-02 12:23:57
原创建时间:2018-02-06 16:48:20 $O(\log_2n)$的优秀算法 二分查找 百度百科原话 二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。 二分查找的时间复杂度是$O(log_{2}n)$ 要求 查找的序列必须采用顺序存储结构 查找的序列必须是有序排列的 思路 将需要查找的序列进行排序(一般为升序排列) 将序列中间位置记录的元素与关键字比较 如果相等,则 返回查找成功 如果不相等,则 将序列分成左右两个子序列,若元素小于关键字,就到左子序列中查找;否则就到右子序列中查找 代码实现 #include <iostream> #include <cstdio> #include <cstring> using namespace std; inline bool BinarySearch(int l,int r,int t,int x[]){ while (l <= r){ int mid = (l + r) >> 1; if (x[mid] == t) return true; if (x[mid] < t) l = mid + 1; if (x[mid] > t) r = mid - 1; } if (l > r) return false; } int