LeetCode Easy 前11-15道

本文介绍了LeetCode中的几道经典算法题,包括使用二分查找在排序数组中寻找目标值或插入位置、Kadane算法求最大子数组和、处理字符串最后一个单词的长度、数组加一问题以及二进制字符串相加。文章提供了多种解题思路,包括直接遍历、二分查找和动态规划,并给出了详细的代码实现。
摘要由CSDN通过智能技术生成

#35 Search Insert Position
#53 Maximum Subarray
#58 Length of Last Word
#66 Plus One
#67 Add Binary

#35 Search Insert Position
要求:给定排序数组和一个数字,返回数字在数组中的索引,或者找不到时,返回插入位置的索引,算法O(logN)
思路1:O(n)容易,遍历即可,但不符合题目要求。

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        for(int i= 0;i<nums.size();i++)
        {
            if(target<=nums[i])
                return i;
        }
        return nums.size();
    }
};

参考大神博客园:Grandyang :LeetCode Binary Search Summary 二分搜索法小结
思路2:既然是排序的数组,那二分查找就可以满足O(logN)

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

#53 Maximum Subarray
要求:给定数组,找出其中最大的组合结果,返回和值;还需要分治法做一下
思路1:没思路啊,不会写
参考大神博客园:Grandyang
O(n)解法,Kadane算法,定义res和num,遍历全部,为什么我的脑子就是想不会。。。

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int res = INT_MIN, curSum = 0;
        for(int num:nums)
        {
            curSum = max(curSum+num,num);
            res= max(curSum,res);
        }
        return res;
    }
};

思路2:分治法我是完全不会的,先Mark一下,后续补充上。

待补充

#58 Length of Last Word
要求:给定字符串,空格分开不同串,返回最后一个串的长度
思路1:倒着处理,从不等于0开始计数一个单词,再次等0返回即可。
对比了大神的想法,第一次,觉得我写的这个比较简单

class Solution {
public:
    int lengthOfLastWord(string s) {
        int result = 0;
        for(int i = s.size()-1;i>=0;i--)
        {
            if(s[i]!=' ')  
                result ++;
            else
            {
                if(result!=0) break;
            }
        }
        return result;
    }
};

参考大神博客园:Grandyang
思路2:将首尾的空格过滤掉,然后开始每个字符串计数,正向计算,最后一次计数就是结果

class Solution {
public:
    int lengthOfLastWord(string s) {
        int left = 0,right = s.size()-1,result = 0;
        while(s[left]==' ') left++;
        while(s[right]==' ')right--;
        for(int i = left;i<=right;i++)
        {
            if(s[i]==' ')
                result = 0;
            else
                result++;
        }
        return result;
    }
};

#66 Plus One
要求:给定数组,为其加1,返回数组,按照10进展输出
思路1:思路不好,先转换为整数,加1,再逐个插入到vector中,不可行,因为溢出。方法不正确,如下代码不通过

class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
        int num = 0;
        vector<int>result;
        for(int i = 0; i<digits.size();i++)
            num = num*10+digits[i];
        num++;
        int temp = num;
        int digit = 0;
        while(num >=10)
        {
            num /=10;
            digit++;
        }
        while(digit>=0)
        {
            int value = pow(10,digit);
            result.push_back(temp/value);
            temp = temp%value;
            digit--;
        }
        return result;
    }
};

思路2:倒着来,如果加1后达到10,就变为0,继续往前算,如果到了最前面,就插入1.

class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
        for(int i = digits.size()-1 ; i>=0; i--)
        {
            if(digits[i]+1 != 10)
            {digits[i]+=1;break;}
            else
                digits[i] = 0;
        }
        if(digits[0]==0) 
            digits.insert(digits.begin(),1);
        return digits;
    }
};

#67 Add Binary
要求:给2个字符串,按照二进制计算输出字符串
思路1:想到了就是从后向前,记录进位,但是代码没实现出来
参考大神博客园:Grandyang
把两个字符串的长度补齐,然后逐个求和计算。按照2取模。得进位。如果最后仍有进位,插入1即可。

class Solution {
public:
    string addBinary(string a, string b) {
        string res;
        int na = a.size(), nb = b.size(),n = max(na,nb),carry = 0;
        if(na > nb)
	        for(int i = 0; i<na-nb;++i) b.insert(b.begin(),'0');
        else
	        for(int i = 0; i<nb-na;++i) a.insert(a.begin(),'0');
        for(int i = n-1;i>=0;--i)
        {
	    int sum = (a[i]-'0') + (b[i]-'0') + carry;
	    res = to_string(sum%2) + res;
	    carry = sum/2;
    	}
        if(carry) res.insert(res.begin(),'1');
        return res;
    }
};

思路2:与思路1差不多,只是不需要对齐2个字符串的长度了。一样是从后往前计算

class Solution {
public:
    string addBinary(string a, string b) {
        string res = "";
        int m = a.size()-1, b = b.size()-1, carry = 0;
        while(m>=0 || n>=0)
        {
	        int p = m>=0 ? a[m--]-'0':0;
	        int q = n>=0 ? b[n--]-'0':0;
	        int sum = p + q + carry;
	        res = to_string(sum%2) + res;
    	    carry = sum/2;
	    }
        return carry ==1 ? "1" +res:res;
    }
};

菜鸡一枚,欢迎大家批评指正,谢谢~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值