招商银行编程题-第4天
三道题
第一题
题目链接:https://leetcode-cn.com/problems/maximum-subarray/
个人题解:经典动态规划
代码:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int res=INT_MAX;
int n=nums.size();
vector<int> dp(n,0);
res=dp[0]=nums[0];
for(int i=1;i<n;i++){
dp[i]=max(nums[i],dp[i-1]+nums[i]);
res=max(res,dp[i]);
}
return res;
}
};
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int now=0;
int maxn=nums[0];
for(const auto &x:nums){
now=max(now+x,x);
maxn=max(maxn,now);
}
return maxn;
}
};
第二题
题目链接:https://leetcode-cn.com/problems/reverse-integer/
个人题解:数学题,带公式就可以了
代码
typedef long long LL;
class Solution {
public:
int reverse(int x) {
LL res=0;
while(x){
res=res*10+x%10;
x/=10;
}
if(res<INT_MIN || res>INT_MAX) return 0;
return (int)res;
}
};
第三题
题目链接:https://leetcode-cn.com/problems/search-in-rotated-sorted-array/
个人题解:三次二分搜索
- 数组长度为 \(0\) 和 \(1\) 时的特判处理。
- 首先二分出是以哪个元素分割数组两部分的。
- 把数组分为 \([0, l - 1]\) 和 \([l, n - 1]\) 两段区间。
- 然后再在两段区间分别二分找 \(target\) 即可。
代码:
class Solution {
public:
int search(vector<int>& nums, int target) {
if(nums.size()==1) return target==nums[0] ? 0 : -1;
int le=0,ri=nums.size()-1;
while(le<=ri)
{
int mid=le+(ri-le)/2;
if(nums[mid]==target) return mid;
if(nums[0]<=nums[mid])
{
if(nums[0]<=target&&target<=nums[mid]) ri=mid-1;
else le=mid+1;
}
else
{
if(nums[mid]<target&&target<=nums[nums.size()-1]) le=mid+1;
else ri=mid-1;
}
}
return -1;
}
};

浙公网安备 33010602011771号