首页 > 编程语言 >LeetCode题(66,69,35,88)--《c++》

LeetCode题(66,69,35,88)--《c++》

时间:2024-07-21 18:56:09浏览次数:16  
标签:digits -- mid 35 int 88 nums1 进位

 66.加一

//
// Created by wxj05 on 2024/7/20.
//
//法一
class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
        bool carry = true; // 进位标志
        for (int i = digits.size() - 1; i >= 0 && carry; --i) {
            digits[i] += 1;
            carry = digits[i] >= 10; // 更新进位标志
            if (carry) {
                digits[i] %= 10; // 清零当前位
            }
        }

        if (carry) {
            digits.insert(digits.begin(), 1); // 如果还有进位,说明需要在最前面添加1
        }

        return digits;
    }
};
//法二
class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
        int len=digits.size();
        int jinwei=0;//进位
        digits[len-1]+=1;//最后一位加一
        for(int i=len-1;i>=0;i--){
            digits[i]+=jinwei;
            jinwei=digits[i]/10;
            digits[i]%=10;
            if(jinwei==0) return digits;
        }
        //如果全为9
        vector<int>digit(len+1);
        digit[0]=1;
        return digit;
    }
};

 方法一

逻辑:
从数组的最后一位开始,尝试加一。
检查是否产生进位(digits[i] >= 10)。
如果产生进位,将当前位清零(digits[i] %= 10)并继续向前检查。
如果遍历完整个数组后仍有进位,意味着整个数加一后超过了最大表示范围,需要在数组最前面插入一个1。

方法二

逻辑:
同样从数组的最后一位开始,尝试加一。
计算进位,并更新当前位。
如果在遍历过程中任何时刻进位变为0,可以直接返回结果,因为后面的位不会再有进位影响。
如果遍历完整个数组后仍有进位,创建一个新的数组,长度比原数组多一位,并在最前面放置1。



69.x的平方根

//
// Created by wxj05 on 2024/7/20.
//
class Solution {
public:
    int mySqrt(int x) {
        int stare=0,end=x;
        int mid=(stare+end)/2;
        while(stare<=end){
            if((long long)mid*mid==x){
                return mid;
            }else if((long long)mid*mid>x){
                end=mid-1;
                mid=(stare+end)/2;
            }else{
                stare=mid+1;
                mid=(stare+end)/2;
            }
        }
        return mid;
    }
};

 二分查找算法

循环条件stare<=end确保搜索区间有效。
使用(long long)mid*mid是为了防止整数溢出,因为mid*mid可能超出int类型的范围。
如果mid的平方等于x,则mid就是我们寻找的平方根的整数部分,直接返回。
如果mid的平方大于x,说明平方根在mid的左侧,因此更新end为mid-1。
如果mid的平方小于x,说明平方根在mid的右侧,因此更新stare为mid+1。

注:mid*mid前面一定要加上long long防止整数溢出。

35.搜索插入位置

//
// Created by wxj05 on 2024/7/20.
//
class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int l=0,r=nums.size()-1,mid;
        while(l<=r){
            mid=(l+r)/2;
            if(nums[mid]==target){
                return mid;
            }else if(nums[mid]>target){
                r=mid-1;
            }else{
                l=mid+1;
            }
        }return r+1;
    }
};

二分查找算法

初始化左边界l为0,右边界r为nums.size()-1。
在l和r之间计算中间位置mid。
循环条件l<=r确保搜索区间有效。
如果nums[mid]等于target,则找到了目标值,返回mid作为其索引。
如果nums[mid]大于target,说明target应该在mid的左侧,因此更新右边界r为mid-1。
如果nums[mid]小于target,说明target应该在mid的右侧,因此更新左边界l为mid+1。

当循环结束时,如果未找到target,r+1将指示target应被插入的位置。这是因为当循环结束时,r和l将分别位于target应插入位置的左右两侧,且由于l最终会超过r,所以r+1将给出正确的插入位置。

88.合并两个有序数组 

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int i=m+n-1;
        while(m>0 && n>0){
            if(nums1[m-1]>nums2[n-1]){
                nums1[i]=nums1[m-1];
                i--;
                m--;
            }else{
                nums1[i]=nums2[n-1];
                i--;
                n--;
            }
        }
        while(n>0){
            nums1[i]=nums2[n-1];
            i--;
            n--;
        }
    }
};

 初始化一个指针i指向nums1的末尾,即m+n-1的位置,这是合并后数组的最后一个位置。
在m>0 && n>0的条件下,比较nums1和nums2的末尾元素,将较大的元素放入nums1的当前位置i,然后递减i,同时减少对应的m或n,以追踪剩余待处理的元素。
当nums1和nums2中都有元素时,较大的元素会被放置在nums1的末尾,保持了合并后数组的有序性。
当nums2中还有元素而nums1中已无元素时,直接将nums2的剩余元素依次放置在nums1的相应位置上。

标签:digits,--,mid,35,int,88,nums1,进位
From: https://blog.csdn.net/2302_80329073/article/details/140569514

相关文章

  • Day02-计算机硬件以及快捷键(电脑基础知识)
    Day02-计算机硬件以及快捷键(电脑基础知识)学习Java第二天,想要学好计算机,最基础也是最能用来装13就是了解电脑的基础知识了!此篇文章依旧是受秦疆老师视频影响,对计算机硬件以及一些基本操作进行了总结在开始之前首先推荐一些电脑必备好用的软件:视频播放器推荐PotPlayer,压......
  • C#中的Action
            C#中的Action是一种委托类型,‌用于引用不返回值的方法。‌Action可以接受0到16个参数,‌并且不返回任何值。‌它是一种通用的委托类型,‌非常方便用于处理不同参数和不同函数签名的情况。‌Action的用法包括声明Action委托类型、‌创建Action实例并赋值给委托变......
  • 01 C#的基本语法概念A
    (一)C#程序结构usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespacenetBasic_learning{//类的定义classRectangle{//(1)属性doublelength;doublewidth;//(2)方法publicvoidAcceptdet......
  • hover元素A改变 多种 元素B的样式
    1)hover元素A改变元素A的子元素B0(.elA:hover.elB0{})<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"......
  • Java实现:图书管理系统,附完整代码
    目录一、菜单 二、基本框架1.book包1.1book类1.2bookList类2.use包2.1User类 2.2AdminUser类2.3NormalUser类 2.4用户菜单3.opera包3.1IOperation接口3.2 AddIOperation类3.3剩余类如下4.Main类4.1login方法4.2main函数 三、具体运行3.1E......
  • Elasticsearch 入门实战(8)--REST API 使用二(Search API)
    本文继续上文(Elasticsearch入门实战(3)--RESTAPI使用一(CAT,Index,Document,IngestAPI))介绍ElasticsearchRESTAPI,相关的环境及软件信息如下:CentOS 7.6.1810、Elasticsearch8.13.4。1、SearchAPIs1.1、CountAPI(查询文档数量)语法:GET/<target>/_count样例:cu......
  • MySQL执行状态查看与分析
     当mysql出现性能问题时,一般会查看mysql的执行状态,执行命令:showprocesslist各列的含义列名含义id一个标识,你要kill一个语句的时候使用,例如 mysql>kill207user显示当前用户,如果不是root,这个命令就只显示你权限范围内的sql语句host显示这个语句是从哪个ip的哪个端口上......
  • wsl4AI :基于WSL2配置AI环境只需要10分钟
    wsl4AI:基于WSL2配置AI环境只需要10分钟......
  • Codeforces Round 958 (Div. 2)
    A.SplittheMultisetForexample, {2,2,4} isamultiset.Youhaveamultiset ......
  • ffmpeg解码基本流程
    1.分配解码器上下文AVCodecContext*avcodec_alloc_context3(constAVCodec*codec);首先,需要为解码器分配一个上下文,这一步通过avcodec_alloc_context3函数完成。这个函数会返回一个指向AVCodecContext结构的指针,它将保存解码器的相关信息。2.将码流中的编解码器信息拷贝到......