招商银行编程题-第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/
个人题解:三次二分搜索

  1. 数组长度为 \(0\)\(1\) 时的特判处理。
  2. 首先二分出是以哪个元素分割数组两部分的。
  3. 把数组分为 \([0, l - 1]\)\([l, n - 1]\) 两段区间。
  4. 然后再在两段区间分别二分找 \(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;
    }
};
posted @ 2022-04-18 14:36  黑VS白-清墨  阅读(43)  评论(0)    收藏  举报