栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

leetcode 初学者最简单二分 c/c++语言

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

leetcode 初学者最简单二分 c/c++语言

一 、35. 搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

class Solution {
public:
    int searchInsert(vector& nums, int target) {
            int l=0,r=nums.size()-1;
            int arr=nums.size();
            while(l<=r){
                int mid=(l+r)>>1;
                if(nums[mid]>=target){
                    arr=mid;
                    r=mid-1;
                }
                else {
                    l=mid+1;
                }
            }
            return arr;
    }
};

思路:先建立两个最左l=0 最右下标r=nums.size()-1;每次对半分 找出中间值是否大于 或者小于 target 再次对半分

直到 l>r 为止 。输出所在下标.

二 、704. 二分查找

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

class Solution {
public:
    int search(vector& nums, int target) {
        int l=0,r=nums.size()-1;
        while(l<=r){
            int mid=(-l+r)/2+l;
            if(nums[mid]target){
                r=mid-1;
            }
            else return mid;
        }
        return -1;
    }
};

思路 :最基础的二分.

三 、剑指 Offer 53 - I. 在排序数组中查找数字 I

统计一个数字在排序数组中出现的次数。

class Solution {
public:
    int search(vector& nums, int target) {
        int l=0,r=nums.size()-1;
        int arr=0;
        while(l<=r){
            int mid=(r-l)/2+l;
            if(nums[mid]>=target){
                arr=mid;
                r=mid-1;
            }
            else l=mid+1; 
        }
        int ret=0,rr=arr;
        for(;rr>0;rr--){
             if(nums[rr-1]==target) ret++;
            else break;
        }
        for(;arr 

思路 :因为有序 所以直接二分找到该值 再左右查找 相等的值 并记录.

四 、400. 第 N 位数字

给你一个整数 n ,请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...] 中找出并返回第 n 位上的数字。

int findNthDigit(int n){
    long long x=n,s=1;int i=0;
    for(i=1;i<15;i++){
        x=(long long )(x-9*i*s);
        if(x<=0){
            x+=9*i*s;
            break;
        }
        s*=10;
    }
    long long  t=(long long )(x-1)/i+s;
    long long ret=0;
    for(int j=(x-1)%i;j 

思路:看注释  首先看懂题 例如 11 是两位数 不是一位 所以这里先判断再那个范围 并且减去 前面范围的个数 再用s统计为最小10的几次方 还剩余当前个数 再利用数学方法 每次再这个范围的数的个数都为i  所以t=(x-1)/i+s 就是第n位数字所在数字的位置 再利用余数 找到所在位置.

五、1300. 转变数组后最接近目标值的数组和

给你一个整数数组 arr 和一个目标值 target ,请你返回一个整数 value ,使得将数组中所有大于 value 的值变成 value 后,数组的和最接近  target (最接近表示两者之差的绝对值最小)。

如果有多种使得和最接近 target 的方案,请你返回这些整数中的最小值。

请注意,答案不一定是 arr 中的数字.

int cmp(const void* c1, const void* c2) {
    return *(int*)c1 > *(int*)c2;
}
int findBestValue(int* arr, int arrSize, int target){
    if(arr==NULL) return 0;
    qsort(arr,arrSize,sizeof(int ),cmp);
    double sum=0,n=arrSize;
    for(int j=0;j0.5){
                return x+1;
            }
            else return x;
        }
        sum+=arr[j];
    }
    return arr[arrSize-1];
}

思路 :首先进行排序 然后 将target的值进行平均 再遍历 每次进行遍历的时候判断当前值是否大于x 如果大于 那么 x就是可行值 再输入时 先进行判断是否需要四舍五入 进行加1操作 。

当 小于的时 sum+arr[j], 并且再次将target平均(arrsize-i)次。

来自英雄哪里出来

题来自leetcode

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/960754.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号