首页 > 其他分享 >基础数据结构-二分变形C语言实现

基础数据结构-二分变形C语言实现

时间:2024-09-13 21:51:22浏览次数:13  
标签:二分 10 right int mid C语言 数据结构 left

基础二分

下面是一个最基础的二分搜索代码,从一个数组(数据从小到大排)中找出某元素。

#include <stdio.h>

// 函数声明
int binarySearch(int arr[], int left, int right, int x);

int main() {
    // 测试数据
    int arr[] = {2, 3, 4, 10, 40};
    int n = sizeof(arr) / sizeof(arr[0]);
    int x = 10; // 要查找的元素

    // 调用二分搜索函数
    int result = binarySearch(arr, 0, n - 1, x);

    // 输出结果
    if(result == -1)
        printf("元素 %d 不在数组中\n", x);
    else
        printf("元素 %d 的索引是 %d\n", x, result);

    return 0;
}

// 二分搜索函数定义
int binarySearch(int arr[], int left, int right, int x) {
    while (left <= right) {
        int mid = (left+right) / 2; // 计算中间索引

        // 检查 x 是否在中间
        if (arr[m] == x)
            return m;

        // 如果 x 大于中间元素,则忽略左侧
        if (arr[m] < x)
            left = m + 1;
        else
            right = m - 1;
    }

    // 元素不存在
    return -1;
}

二分变式一

我们希望找出不小于某数x的最小数(不大于某数x的最大数也是同理),数据从小到大排。

这时要注意,在分析的时候我们可以分成三类情况来讨论:

1、找到了x,这时我们应该继续往右走,右边才是我们要找的

2、比x大,这时左边可能要往左走,但是可能此时这个就是我们要找的

3、比x小,继续往右走

根据这三种情况我们修改代码:

#include<stdio.h>

int min_ge(int *A, int n, int x){
	int left =  0, right = n, mid;
	while (left<right){
		mid = (left + right)/2;
		if (A[mid]>x)right = mid;
		else left = mid + 1;
	}
	return left;
}

int main(){
	int A[] = {8,10,33,49,55,63,63,70,85,85};
	int x;
	printf("请输入要查找的数下限:");
	scanf("%d",&x);
	int p = min_ge(A,10,x);
	if (p<10) printf("第一个数A[%d] = %d\n",p,A[p]);
	else printf("不存在这样的数");
	
	return 0;
	
}

还有两个改动的点:

1、循环条件变为left<right,无需取等,取等的位置已经计算过了

2、返回值为left或者right都行,因为此时两者相等

二分变式二

有一组木棍,我们希望切成K根,每根长度一样,我需要找到最长能切的长度。

这里变式在于寻找的是一个长度,而不是数组里的一个值。

要注意:

1、确定搜索空间,是从1到次长+1

2、编写check函数确认是否满足题目条件。

/*
计算最长木棍的切割方案
*/

#include<stdio.h>

int check(int *A, int n, int K, int mid) {
    int sum = 0;
    for (int i = 0; i < n; i++) {  // 数组下标从0开始
        sum += A[i] / mid;
        if (sum >= K) return 1;
    }
    return 0;  // 这里不需要else,直接返回0
}

int long_stick_cut(int *A, int n, int K){
    int left = 1, right = A[n - 1]+1, mid;
    while (left < right) {  
        mid = (left + right) / 2;
        if (check(A, n, K, mid)) {
            left = mid + 1;  
        } else {
            right = mid;  
        }
    }
    return left-1; 
}

int main(){
    int A[10] = {8, 10, 33, 49, 55, 63, 63, 70, 85, 85};
    printf("L = %d\n", long_stick_cut(A, 10, 32));  
    return 0;
}

思考问题

(某大厂/考研面试题)二分为什么要(left+right)/2呢?我不能随机在[left,right]之间取一个值吗?

标签:二分,10,right,int,mid,C语言,数据结构,left
From: https://blog.csdn.net/Q_w7742/article/details/142187177

相关文章

  • 【数据结构】字符串与JSON字符串、JSON字符串及相应数据结构(如对象与数组)之间的相互转
    前言:下面打印日志用的是FastJSON依赖库中的 @Log4j2。依赖:<!--AlibabaFastjson--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.80</version></dependency>目录普通字......
  • 重生之我在代码随想录刷算法第一天 | 704.二分查找、27.移除元素
    参考文献链接:代码随想录本人代码是Java版本的,如有别的版本需要请上代码随想录网站查看。704.二分查找力扣题目链接解题思路这道题明确规定了数组是有序并且不重复的,要在这样的数组中寻找一个给定值的位置不由得让我想起来以前的数学知识二分查找。所以很快确定了思路......
  • 【每日一题】LeetCode 2398.预算内的最多机器人数目(滑动窗口、数组、二分查找、前缀和
    【每日一题】LeetCode2398.预算内的最多机器人数目(滑动窗口、数组、二分查找、前缀和、堆(优先队列))题目描述给定两个整数数组chargeTimes和runningCosts,分别代表n个机器人的充电时间和运行成本。再给定一个整数budget,表示预算。我们需要计算在不超过预算的情况下,最......
  • 数据结构之美-深入理解树形结构
    一认识树形结构树形结构是一种广泛应用的非线性数据结构,它在计算机科学和日常生活中都有广泛的应用。比如文件系统,邮件系统,编译器语法树,决策树,网络通信,甚至机器学习当中,都有树形数据结构的影子。本文旨在梳理日常用到的各类树形结构以及其优点和劣势,让渎者对树形结构有一个深入......
  • 关于 wqs 二分的一言两语
    感觉一个比较入门的题目是P2619。你要求的是恰好有\(need\)条白色边的,这个很难表示,因为如果直接跑一遍MST,你不能保证一定选了\(need\)条,有可能白色边“太好了”或者“太坏了”。但是我们发现,如果白色边“越好”,就会尽可能选白色,反之亦然。也就是说如果我们增加一个费用:给所......
  • C语言 12 函数
    其实函数在一开始就在使用了://这就是定义函数intmain(){...}程序的入口点就是main函数,只需要将程序代码编写到主函数中就可以运行了,不过这个函数只是由我们来定义,而不是我们来调用。当然,除了主函数之外,一直在使用的printf也是一个函数,不过这个函数是标准库中已经......
  • 【数据结构】第八节:链式二叉树
    个人主页: NiKo数据结构专栏: 数据结构与算法 源码获取:Gitee——数据结构一、二叉树的链式结构typedefintBTDataType;typedefstructBinaryTreeNode{ BTDataTypedata; structBinaryTreeNode*left;//左子树根节点 structBinaryTreeNode*right;//右子......
  • 二分图最大权完美匹配
    问题给定一个二分图,左部有\(n\)个点,右部有\(m\)个点,边\((u_i,v_j)\)的边权为\(A_{i,j}\)。求该二分图的最大权完美匹配。转化问题可以写成线性规划的形式,设\(f_{i,j}\)表示匹配中是否有边\((u_i,v_j)\),求\[\begin{gather*}\text{maximize}\quad&\sum_{i=1}^n......
  • C# 开源教程带你轻松掌握数据结构与算法
    前言在项目开发过程中,理解数据结构和算法如同掌握盖房子的秘诀。算法不仅能帮助我们编写高效、优质的代码,还能解决项目中遇到的各种难题。给大家推荐一个支持C#的开源免费、新手友好的数据结构与算法入门教程:Hello算法。项目介绍《HelloAlgo》是一本开源免费、新手友好的数......
  • 数据结构和算法之基本概念
    原文出处:数据结构和算法之基本概念  关注码农爱刷题,看更多技术文章!!其他文章:Java基础之数组    在计算机领域中,数据元素都不是孤立存在的,而是在它们之间存在着某种关系,这种数据元素相互之间的关系称为结构(Structure)。数据结构是相互之间存在一种或多种特定关系的数......