二分法在有序数组中的应用(Java&C)

文章目录

在有序数组中确定num是否存在

Java实现

java 复制代码
public static boolean exist(int[] arr, int num) {
		if (arr == null || arr.length == 0) {
			return false;
		}
		int L = 0;
        int R = arr.length - 1;
        int M = 0;
		while (L <= R) {
			M = (L + R) / 2;
			if (arr[M] == num) {
				return true;
			} else if (arr[M] > num) {
				R = M - 1;
			} else {
				L = M + 1;
			}
		}
		return false;
	}

C语言实现

c 复制代码
int exist(int arr[], int length, int num) {
    if (arr == NULL || length == 0) {
		return 0;
	}
	int L = 0;
	int R = length - 1;
    int M = 0;
	while (L <= R) {
		M = (L + R) / 2;
		if (arr[M] == num) {
			return 1;
		}
		else if (arr[M] < num) {
			L = M + 1;
		}
		else {
			R = M - 1;
		}
	}
	return 0;
}

在有序数组中找>=num的最左位置

Java实现

java 复制代码
public static int findLeftIndex(int[] arr, int num) {
        int L = 0;
        int R = arr.length - 1;
        int M = 0;
        int Index = -1;
        while (L <= R) {
            M = (L + R) / 2;  
            // 数组长度很长的时候有溢出风险
            // M = L + (R - L) / 2;
            // M = L + ((R - L) >> 1);
            if (arr[M] >= num) {
                Index = M;
                R = M - 1;
            } else {
                L = M + 1;
            }
        }
        return Index;
    }

C语言实现

c 复制代码
int findLeftIndex(int arr[], int length, int num) {
	int R = length - 1;
	int L = 0;
	int M = 0;
	int Index = -1;
	while (L <= R) {
        M = (R + L) / 2;
		if (arr[M] >= num) {
			Index = M;
			R = M - 1;
		}
		else {
			L = M + 1;
		}
	}
	return Index;	
}

在有序数组中找<=num的最右位置

Java实现

java 复制代码
public static int findRightIndex(int[] arr, int num) {
		int L = 0;
    	int R = arr.length - 1;
    	int M = 0;
		int Index = -1;
		while (L <= R) {
			M = (L + R) / 2; 
			if (arr[M] <= num) {
				Index = M;
				L = M + 1;
			} else {
				R = M - 1;
			}
		}
		return Index;
	}

C语言实现

c 复制代码
int findRightIndex(int arr[], int length, int num) {
	int R = length - 1;
	int L = 0;
	int M = 0;
	int Index = -1;
	while (L <= R) {
        M = (R + L) / 2;
		if (arr[M] <= num) {
				Index = M;
				L = M + 1;
			} else {
				R = M - 1;
			}
		}
	return Index;
}
相关推荐
周航宇JoeZhou8 分钟前
JP3-3-MyClub后台后端(二)
java·mysql·vue·ssm·springboot·项目·myclub
DIY机器人工房14 分钟前
一个可以检测本机的字节顺序,并对任意数据进行字节顺序的反转操作的代码。
嵌入式硬件·算法·嵌入式·diy机器人工房
羊锦磊16 分钟前
[ java 网络 ] TPC与UDP协议
java·网络·网络协议
找不到、了42 分钟前
Java设计模式之<建造者模式>
java·设计模式·建造者模式
杰克尼2 小时前
11. 盛最多水的容器
算法·leetcode·职场和发展
Code blocks2 小时前
关于“LoggerFactory is not a Logback LoggerContext but Logback is on ......“的解决方案
java·spring boot·后端
程序员编程指南3 小时前
Qt 嵌入式界面优化技术
c语言·开发语言·c++·qt
程序员Xu4 小时前
【OD机试题解法笔记】查找接口成功率最优时间段
笔记·算法
云泽8084 小时前
数据结构前篇 - 深入解析数据结构之复杂度
c语言·开发语言·数据结构
技术思考者4 小时前
Leetcode - 反转字符串
数据结构·算法·leetcode