二分法

二分法

最后都变了- 提交于 2020-01-19 18:50:43
1. 二分查找法代码实现: 1 // 二分查找法 2 // A[]为严格递增序列,left为二分下界,x为欲查询的数 3 // 二分区间为左闭右闭的[left, right], 传入的初值为[0, n-1] 4 int binarySearch(int A[], int left, int right, int x){ 5 int mid; 6 while (left <= right){ 7 mid = (left + right) / 2; // mid = left + (right - left) / 2; 8 if (A[mid] == x){ 9 return mid; 10 } 11 else if (A[mid] > x){ 12 right = mid - 1; 13 } 14 else if (A[mid] < x){ 15 left = mid + 1; 16 } 17 } 18 19 return -1; 20 } 2. 二分法求序列中第一个大于等于x的元素的位置L 1 // 求序列中第一个大于等于x的元素的位置L 2 // 二分上下界为左闭右闭的[left, right], 传入的初值为[0, n] 3 int lower_bound(int A[], int left, int right, int x){ 4 int mid; 5 while

C# 二分法的解读

早过忘川 提交于 2020-01-19 15:39:54
注:一定是有序的数组,才可以使用这种算法,如果数组没有排序则先进行排序后再调用此方法。 1、二分法是做什么的呢? 当然是查找数组中的数据了,开个玩笑,哈哈哈。 2、为啥要用这种方式呢? 二分顾名思义,就是 将一组数据对半分开(比如左右两部分,下面用左右数组表示) ,从中间位置开始查找, 如果中间这个值正是咱们要找的值则直接 返回这个值(或者索引) ,如果没有找到,那么去判断中间的这个值和咱们要找的值哪个大, 如果中间值比咱们要找的值大,则将之前分开的数组的左面的数组再进行对半分开,递归直到找到咱们要的那个值才会结束,反之亦然, 但是如果就是 没有 咱们找的 值 那么岂不是 死循环 了嘛, 所以要加判断,如果递归到开始索引小于等于结束索引,则退出。 这种搜索算法每一次比较都使搜索范围缩小一半,这样对于大数据量的数组,极大的提升了查找效率。 private void button1_Click(object sender, EventArgs e) { int[] arry = { 8, 15, 19, 23, 26, 31, 40, 65, 91 }; //测试 要找的数字是15 int key = 15; //查找数并返回 若有,返回该数,没有则返回-1 int rr = BinarySearch(arry, 0, arry.Length - 1, key); } ///

二分法

若如初见. 提交于 2020-01-18 23:44:44
众所周知,锋哥喜欢的是个子不高不怕打雷的女生,但可惜的是,锋哥到现 在都没有女朋友。 作为锋哥的前队友我当然要在这个题目中给他多找几个对象! 现在锋哥有 k 个对象(k 可能大于农大的学生数量),圣诞节快要到了,锋 哥现在手上有 n 个巧克力棒,但是这些巧克力棒的长度是不一样的,第 i 个巧克 力棒的长度为 a[i],锋哥想给他的对象们相同的待遇,也就是说每个人的都是一 样长的。 巧克力棒是可以分割开的,但是给对象的不能是两个拼接起来的,也就是说, 你可以用一个长度为 10的分割成两个 5 给两个对象,但是你不能拿着一个 2 和 一个 3 给一个对象 现在锋哥想请你帮他求出巧克力棒的长度,以便他给他的对象们。 输入 第一行输入:两个整数 n,k (1<=k,n<=1e6) 下面一行输入:n 个整数,a[i]表示每个巧克力棒的长度 1<=a[i]<=1e9 输出 一个整数,表示最长的可以分配给对象们的巧克力棒长度 样例 Sample Input 1 5 3 5 3 3 3 3 Sample Output 1 3 # include <iostream> # include <algorithm> using namespace std ; int a [ 1000001 ] ; int main ( ) { int n , k ; cin >> n >> k ; int i = 0

二分法

和自甴很熟 提交于 2020-01-18 21:23:22
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #define N 1000 #define M 1000 using namespace std; int n,f; int a[N]; bool check(int x) { int s=0; for(int i=1;i<=n;i++) s+=a[i]/x; if(s>=f) return true; return false; } int main() { cin>>n>>f; f++; int sum=0; for(int i=1;i<=n;i++) { cin>>a[i]; sum+=a[i]; } int l=0,r=sum/f; while(l<r) { int mid=(l+r+1)/2; if(check(mid)) l=mid; else r=mid-1; } cout<<l<<endl; } 来源: https://www.cnblogs.com/liusu123456/p/12210148.html

leetcode 69. Sqrt(x) 二分法 python3

淺唱寂寞╮ 提交于 2020-01-16 21:08:01
一.问题描述 Implement int sqrt(int x) . Compute and return the square root of x , where x is guaranteed to be a non-negative integer. Since the return type is an integer, the decimal digits are truncated and only the integer part of the result is returned. Example 1: Input: 4 Output: 2 Example 2: Input: 8 Output: 2 Explanation: The square root of 8 is 2.82842..., and since the decimal part is truncated, 2 is returned. 二.解题思路 方法一:迭代 从0~i开始迭代,知道i*i大于x的时候,返回i-1. 时间复杂度:O(N)。 方法二:二分法 这道题其实就是然我们从0~x中,找一个数满足 i*i<=x and (i+1)*(i+1)>x。 和二分法的思路差不多,注意结束条件,结束条件l>r,返回值l-1,原因参考结束条件(当l超过r的时候,说明l-1太小,但是l=r,说明l又太大)

java-二分法查找数组元素

江枫思渺然 提交于 2020-01-16 13:26:46
package com.rj.bd.lx; import java.util.Arrays; /** * @desc 数组元素的查找之二分法 * @author yhx * @time 2019-09-11 * */ public class ErFenFa { public static void main(String[] args) { int[] a = {123,235,45,6,7,9,95,4}; // 由于二分法适合已经排序好的数组所以先将数组进行排序 for (int i = 0; i < a.length-1; i++) { for (int j = 0; j < a.length-1-i; j++) { if(a[j+1]<a[j]){ int temp = a[j+1]; a[j+1] = a[j]; a[j] = temp; } } } System.out.println(Arrays.toString(a)); System.out.println(Search(a,6)); } private static int Search(int[] a, int value) { int low = 0; int high = a.length-1; while(low<high){ int mid=(low+high)/2; if(value==a[mid

二分法查找总结(一)

佐手、 提交于 2020-01-16 05:27:49
目录 题目描述 My Answer 总结 题目描述 实现 int sqrt(int x) 函数。 计算并返回 x 的平方根,其中 x 是非负整数。 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。 示例 1: 输入: 4 输出: 2 示例 2: 输入: 8 输出: 2 说明: 8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。 My Answer class Solution { public int mySqrt(int x) { if(x==0){ return 0; } if(x==1){ return 1; } int left=0; int right=x; while(left<right){ int middle=left+(right-left)/2; if(x/middle==middle){ return middle; }else if(x/middle>middle){ if(x/(middle+1)>middle+1){ left=middle; }else if(x/(middle+1)==middle+1){ return middle+1; }else if(x/(middle+1)<middle+1){ return middle; } }else{ right=middle; } } return -1;

【二分法】1.33. 搜索旋转排序数组(力扣总结)

孤街醉人 提交于 2020-01-13 06:06:13
假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。 你可以假设数组中不存在重复的元素。 你的算法时间复杂度必须是 O(log n) 级别。 示例 1: 输入: nums = [4,5,6,7,0,1,2], target = 0 输出: 4 示例 2: 输入: nums = [4,5,6,7,0,1,2], target = 3 输出: -1 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/search-in-rotated-sorted-array 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 class Solution { public: int search(vector<int>& nums, int target) { int L=0,R=nums.size()-1; while(L<=R){ int mid = L+(R-L)/2; if(nums[mid]==target) return mid; else if(nums[L]<=nums[mid]){ if(target<nums[mid]&

二分法总结

◇◆丶佛笑我妖孽 提交于 2020-01-12 13:54:00
二分法 一.使用二分需要满足两个条件:有界性和单调性 二.二分法模板(二分答案与二分查找) 三.二分法的应用:二分查找.查找有序序列中的元素,返回下标 四.二分法的应用:二分答案. 一.使用二分需要满足两个条件:有界性和单调性 有界性 :有界二分答案应在一个闭区间上进行; 单调性 :问题的解分布在一个区间上,这里有很多不合法的解,也有很多合法的解.考虑所有合法(可行)解,目标是从这些可行解中找到一个最优的作为答案. 注意到 最优解一定可行,但可行解不一定最优. 假设整个序列具有单调性,一般地,若一个数 x x x 为合法解,则对 ∀ x ′ < x {\forall}x'<x ∀ x ′ < x ,都是合法解.若有一个数 y y y 是非法解,则对 ∀ y ′ > y {\forall}y'>y ∀ y ′ > y ,都是非法解.正是因为有单调性的存在,才使得每次舍弃解区间的一半 [ l , m i d ] [l,mid] [ l , m i d ] 或 [ m i d , r ] [mid,r] [ m i d , r ] 这种优化是正确的,因为保证舍弃的区间一定是非法解区间. 二.二分法模板(二分答案与二分查找) 二分法总是可以分成"求满足某条件的最大值"与"满足条件的最小值"两种情况, 其中"某条件"常常被封装成check()函数 判断当前解是否可行. (1)整数域的二分 /

二分法快速排序

风格不统一 提交于 2020-01-10 03:58:36
我在实现二分法快速排序的时候,最初的程序是这样的。 # include <iostream> using namespace std ; void qsort ( int arr [ ] , int left , int right ) { int l = left ; int r = right ; int value = arr [ l ] ; do { while ( l < r && arr [ r ] >= value ) r -- ; if ( arr [ r ] < value ) { arr [ l ] = arr [ r ] ; l ++ ; } while ( l < r && arr [ l ] <= value ) l ++ ; if ( arr [ l ] > value ) { arr [ r ] = arr [ l ] ; r -- ; } } while ( l != r ) ; arr [ l ] = value ; qsort ( arr , left , r -- ) ; qsort ( arr , l ++ , right ) ; } int a [ 100 ] ; int main ( ) { freopen ( "1.txt" , "r" , stdin ) ; freopen ( "2.txt" , "w" , stdout ) ;