#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;
}
};
菜鸡一枚,欢迎大家批评指正,谢谢~