首页 > 其他分享 >已知一个有序数组arr,和一个数字num。返回数组中是否含有这个数字。(使用二分法)

已知一个有序数组arr,和一个数字num。返回数组中是否含有这个数字。(使用二分法)

时间:2022-10-29 14:23:33浏览次数:55  
标签:arr return 数字 int 二分法 num 数组 public

package class01;

import java.util.Arrays;

/**
 * 二分法
 * 已知一个有序数组arr,和一个数字num。返回数组中是否含有这个数字。(使用二分法)
 * <p>
 * 常规二分法的时间复杂度,O(logN)。
 * O(log2N),即log以2为底,N的对数。
 * <p>
 * 一次砍一半,一次砍一半,一次砍一半。
 * N个数,一共砍几次呢?一共砍了O(log2N)次,每砍一次,看一眼这个中点上的数,是O(1)的。
 * 所以就是log2N乘以1,还是O(log2N)。
 */
public class Code04_BSExist {
    public static void main(String[] args) {
        //当写while (L < R)时,是错误的,反例如下。正确的写法是while (L <= R)。
        //-24 -21 -19 -13 -10 -8 0 7 10 10 20
        //int[] arr = {-24, -21, -19, -13, -10, -8, 0, 7, 10, 10, 20};
        int maxSize = 30;
        int maxValue = 30;
        int testTimes = 10;
        int num = 7;
        boolean flag = true;
        for (int i = 0; i < testTimes; i++) {
            int[] arr = generateRandomArray(maxSize, maxValue);
            Arrays.sort(arr);
            printArr(arr);
            System.out.println(num);
            boolean b = exist(arr, num);
            System.out.println(b);
            System.out.println("---");
            boolean test = test(arr, num);
            if (b != test) {
                flag = false;
                break;
            }
        }
        System.out.println(flag ? "nice!" : "oops!");
    }


    public static boolean exist(int[] sortedArr, int num) {
        int L = 0;
        int R = sortedArr.length - 1;
        while (L <= R) {
            int mid = L + ((R - L) >> 1);//必须要加括号,否则会先算加法,导致死循环。
            if (sortedArr[mid] < num) {
                L = mid + 1;
            } else if (sortedArr[mid] > num) {
                R = mid - 1;
            } else {
                return true;
            }
        }
        return false;
    }

    public static int[] generateRandomArray(int maxSize, int maxValue) {
        int[] arr = new int[(int) ((maxSize + 1) * Math.random())];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random());
        }
        return arr;
    }

    public static void printArr(int[] arr) {
        for (int i : arr) {
            System.out.print(i + " ");
        }
        System.out.println();
    }

    public static boolean test(int[] arr, int num) {
        for (int i : arr) {
            if (i == num) {
                return true;
            }
        }
        return false;
    }

}

 

标签:arr,return,数字,int,二分法,num,数组,public
From: https://www.cnblogs.com/TheFloorIsNotTooHot/p/16838640.html

相关文章

  • 二分法的应用(求有序序列第一个满足某个条件的元素的位置的方法)
    二分法求有序序列第一个满足某个条件的元素的位置的方法(模版)://二分区间为左闭右闭[left,right],初始值left、right必须覆盖解的所有可能intsolve(intleft,intrigh......
  • 困难-2449. 使数组相似的最少操作次数
    给你两个正整数数组 nums和 target ,两个数组长度相等。在一次操作中,你可以选择两个不同 的下标 i和 j ,其中 0<=i,j<nums.length ,并且:令 nums[i]=num......
  • 罗马数字转整数
    题目:罗马数字对应阿拉伯数字字符数值I1V5X10L50C100D500M1000罗马数字的规则都是,大的在小的左边,如12XII15XV;特殊情况是,小的在大的左边,如4,9,40,9......
  • 二分法&三分法模板
    二分法求函数零点longdoublel=INT_MIN,r=INT_MAX,mid,eps=1e-6;while(r-l>eps){ mid=(l+r)/2; if(f(mid)<0)l=mid; elser=mid;}cout<<l<<endl;三分法......
  • JS中搜索数组的四种方法
    前端经常要通过javaScript来处理数组中的数据,其中就包括检查数组中是否包含满足特定搜索条件的单个或者多个值,这就需要我们关于用于确认的布尔值、数组中值得位置索引或包含......
  • 扁平数组转树结构
    <!DOCTYPEhtml><htmllang="en"> <head> <title></title> <metacharset="UTF-8"> <metaname="viewport"content="width=device-width,initial-scale=1"> <......
  • 将1000内素数放入数组
    #include<stdio.h>intmain(){inti=0;intj=0;inttemp=0;intarr[1000]={};for(i=2;i<1000;i++){ for(j=2;j<i;j++){ if(i%j==0){ break;}} if(......
  • docker访问外部https数字证书问题
    一般我们构建的docker镜像使用的都是alpinelinux系统,默认是不带ca-certificates根证书的,导致无法识别外部https携带的数字证书。在访问的时候,会抛出​​509:certi......
  • 14、计算数字范围中所有的偶数
    题目:  输入开始和结束值(不包含),得到所有偶数  偶数:能够被2所整除的整数,是2的倍数。  输入:begin=3;end=20  返回:[4,6,8,10,12,14,16,18] 解题思路:  ......
  • 1879. 两个数组最小的异或值之和
    题目描述给了两个数组nums1和nums2,长度都是n,问怎么排列可以让数组对应元素的异或值之和最小?f1-二进制枚举+状态压缩基本分析1.有没有是啥贪心做法,因为看到相同元素异或......