首页 > 其他分享 >【C语言】数组——二分查找

【C语言】数组——二分查找

时间:2025-01-05 10:30:34浏览次数:3  
标签:二分 right nums int mid C语言 查找 result left

题1 704.二分查找【简单】

int search(int* nums, int numsSize, int target) {
    
    int left = 0, right = numsSize - 1;
    int mid = (left + right)/2;
    int result = -1;

    while(left<=right){
        
        if(nums[mid] == target){
            result = mid;
            break;
        }else if(nums[mid] > target){
            right = mid-1;
        }else if(nums[mid] < target){
            left = mid+1;
        }
        mid = (left + right)/2;
    }
    return result;
}

题2 35. 搜索插入位置【简单】

int searchInsert(int* nums, int numsSize, int target) {
    int left = 0, right = numsSize-1;
    int mid = (left + right) / 2;
    int result;
    if(target < nums[0])    return result = 0;
    if(target > nums[numsSize-1])    return result = numsSize;
    while(left <= right){
        if(nums[mid] == target)
            return result = mid;
        if(nums[mid] > target){
            right = mid - 1;
            result = left;
        }else if(nums[mid] < target){
            left = mid + 1;
            result = left;
        }
        mid = (left + right) / 2;
    }
    return result;
}

题3 34.在排序数组中查找元素的第一个和最后一个位置【中等】

int* searchRange(int* nums, int numsSize, int target, int* returnSize) {

    int *reslut =  (int *)malloc(sizeof(int)*2);
    reslut[0] = -1; reslut[1] = -1;   
    *returnSize = 2;
    int left = 0, right = numsSize - 1;
    if(0 == numsSize){
        return reslut;
    }  
    while(left <= right){
        int mid1 = (left + right) / 2;       
        if(target==nums[mid1]){
            right = mid1 - 1;
        }else if(target > nums[mid1]){
            left = mid1 + 1;
        }else if(target < nums[mid1]){
            right = mid1 - 1;
        }             
    }
    // reslut[0] = mid1;
    if(left < numsSize && nums[left] == target){
        reslut[0] = left;
    }
    left = 0, right = numsSize - 1;
    while(left <= right){
        int mid2 = (left + right) / 2;
        if(target==nums[mid2]){
            left = mid2 + 1;
        }else if(target < nums[mid2]){
            right = mid2 - 1;
        }else if(target > nums[mid2]){
            left = mid2 + 1;
        }     
    }
    if(right >= 0 && nums[right] == target){
        reslut[1] = right;
    }
    // reslut[1] = mid2; 
    return reslut;
}

题4 69. x 的平方根【简单】

个人解

int mySqrt(int x) {
    int t = 0;
    long long temp = x;
    long long start = 1, end, result;
    if (0 == x)    return 0;
    while (temp >= 1) {
        temp /= 10;
        t++;
    }
    if (0 == t % 2)  t--;
    if (1 == t) {
        start = 1;
    }
    else {
        for (int i = 0; i < t / 2; i++) {
            start *= 10;
        }
    }
    end = start * 10;

    while (start <= end) {
        result = (end + start) / 2;
        if (result * result <= x && (result + 1) * (result + 1) > x) {
            return result;
        }
        else if (result * result < x) {
            start = result + 1;
        }
        else if (result * result > x) {
            end = result - 1;
        }
    }
    return result;
}

牛顿迭代法

int mySqrt(int x) {
	if (x <= 1) return x; // 如果 x 小于等于 1,直接返回 x
     	long r = x;
    	 while (r * r > x) { // 牛顿迭代法
         	r = (r + x / r) / 2;
    	}
    return (int)r;
}

题5 367.有效的完全平方数【简单】

bool isPerfectSquare(int num) {
    //10*10=100,99*99=9801,两位数相乘的位数在 3-4 位,n位在2n
    //初步判断位数
    int t = num,  ii = 0;
    for(int i = 1; t != 0; i++){
        t = t / 10; ii = i;
    } 
    int left, right;
    if(ii%2==1){
        left = pow(10, (ii-1)/2);
        right = pow(10, (ii-1)/2+1);
    }else{
        left = pow(10, ii/2-1);
        right = pow(10, ii/2);
    }
    
    long int mid = (left + right) / 2;
    while(left <= right){
        if(mid*mid < num) left = mid+1;
        if(mid*mid > num) right = mid-1;
        if(mid*mid == num) return true;
        mid = (left + right) / 2;
    }
    return false;
}

标签:二分,right,nums,int,mid,C语言,查找,result,left
From: https://blog.csdn.net/weixin_45538618/article/details/144932767

相关文章

  • 二分 + 倍增 做题笔记
    一些关于二分和倍增的题,大体按照题目难度排序。1.CF1951HThanosSnap简要题意给定一个长为\(2^n\)的序列\(a_0,a_1,\cdots,a_{2^n-1}\),对所有\(t\in[1,n]\)求解如下问题:A和B两人在序列\(a\)上博弈,一共进行\(t\)轮操作。每轮操作的流程如下:A可以选......
  • C语言:结构体
    C语言已经提供了内置类型,如:char、short、int、long、float、double等,但在处理一些问题时只有这些内置类型还是不够的,假设我想描述学生,这时单一的内置类型是不行的。描述一个学生需要名字、年龄、学号、身高、体重等。C语言为了解决这个问题,增加了结构体这种自定义的数据类型,让......
  • STLG_01_09_程序设计C语言 - 指针
        C语言中的指针是一个非常重要的概念,它允许程序直接访问和操作内存地址。理解指针对于掌握C语言编程至关重要。1.指针的基本概念指针:指针是一个变量,它存储的是另一个变量的内存地址。指针变量:指针变量专门用来存储内存地址。2.指针的声明与初始化2.1指针的声......
  • 【C语言程序设计——函数】编写函数求解累加和(头歌实践教学平台习题)【合集】
    目录......
  • C语言初阶习题【20】扫雷游戏
    1.用C语言实现扫雷游戏本博客和三子棋游戏比较大的区别是,三子棋游戏是写完了再总结的,本博客是边代码实现边编辑博客,所以本博客会比较详细的po出每一步骤,在每实现一个小功能的时候我们都先验证下效果,再继续下一步。2.思路总体的思路和三子棋游戏是一样的,我们把游戏实现部......
  • C语言初阶习题【19】三子棋游戏
    1.实现三子棋游戏2.思路我们把游戏实现部分放在game.c和game.h中,把游戏的测试代码放到test.c中main函数在test.c中。2.1test.c中先写main函数,在main函数中调用test函数。intmain(){ test(); return0;}test.c函数实现让玩家进行选择是否要进行游戏这里用到......
  • C语言数据结构与算法(栈和队列)
    1.栈1.栈的概念及结构栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(LastInFirstOut)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除......
  • C语言:三子棋plus版本如约而至
    唉,想了好久,这才想出一个可行的方案,来与大家分享,也希望鄙人的想法可以抛砖引玉,让大家有更多的想法来完善这个游戏,话不多说,让我们开始吧(阅读提醒,希望各位先把鄙人先前写的三子棋的游戏的博客先看一看再来阅读此文)OK,我们这次的主要任务就是完善电脑下棋,致力于写一个更加完善的AI,n......
  • C语言的其他关键字
    数据类型enum枚举,为一个变量定义一组命名的整数常量,或者更简单点就是给一组变量(一般是相关的)起一个统一的名字,这一组变量在其中就会有一个对应的整数常量,从0开始依次递增,也可显式指定,之后的依次递增,可以用这个名字.变量名的格式进行使用,对应的整数值主要是为了内部表示和可能......
  • Final Boss(二分答案)
    原题链接:Problem-F-Codeforces思路:二分答案代码:#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintxmmm=2e5+10;inta[xmmm],b[xmmm];intn,m;intcheck(intx){intsum=0;for(inti=1;i<=n;i++){sum+=(1+(x-......