二分法在有序数组中的应用(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;
}
相关推荐
垆边人似月.几秒前
任务混部(200 分档)
算法
言乐66 分钟前
Python区分广度优先深度优先宽度优先的区别
python·算法·深度优先·广度优先·宽度优先
如意猴24 分钟前
【C++】007 C/C++ 内存管理机制、malloc与new的区别及模板初阶
java·c++·算法
朝朝辞暮i27 分钟前
C++ 第 32 课:main()、rclcpp::init()、spin()、shutdown()
开发语言·c++·算法
可乐鸡翅yeah_34 分钟前
HLS 分片过期清理,直播旧 TS 分片磁盘爆满问题处理
java·后端·spring·m3u8·m3u8在线·音视频在线播放
专业程序开发源1 小时前
SSM校园拍摄交流服务平台36936-计算机课程设计、毕业设计
java·spring boot·后端·python·elasticsearch·php·课程设计
用户094248568031 小时前
第23章:OpenJDK逃逸分析、标量替换与锁优化
java·jvm
wuminyu1 小时前
LockStack在虚拟线程Mount和Unmount拷贝过程剖析
java·linux·c语言·jvm·c++
Felven1 小时前
B. Reverse a Permutation
c语言
樱花落木兰1 小时前
分布式登录实战:Session 会话共享改造,Redis 存储用户登录状态
java·javascript·数据库·redis·分布式·缓存