每天一刷20200620

问题
给定n个字符串,请对n个字符串按照字典序排列。
输入描述:

输入第一行为一个正整数n(1≤n≤1000),下面n行为n个字符串(字符串长度≤100),字符串中只含有大小写字母。

输出描述:

数据输出n行,输出结果为按照字典序排列的字符串。
思路
看到字典序,哈哈哈,STL大法好。。。
代码

#include<iostream>
#include<set>
#include<string>
using namespace std;
int main(){
    int input;
    cin>>input;
    string str;
    multiset<string> s;
    while(input--){
        cin>>str;
        s.insert(str);
    }
    set<string>::iterator it;
    for(it=s.begin();it!=s.end();++it)
        cout<<*it<<endl;
}

问题
寻找峰值
峰值元素是指其值大于左右相邻值的元素。

给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。

数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。

你可以假设 nums[-1] = nums[n] = -∞。
思路
log(N)的时间复杂度,提示使用二分法。要结合数组的具体情况解决
代码
O(N)解法:

class Solution {
public:
    int findPeakElement(vector<int>& nums) {
        for(int i=0;i<nums.size()-1;++i){//因为下面要访问i+1个元素,所以下标到nums.size()-1,不然会越界
            if(nums[i] > nums[i+1])
                return i;
        }
        return nums.size()-1;
            
    }
};

O(logN)解法:

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

PS:二分法这个边界条件的确定是难点。。。默认nums[-1]和nums[len]都是负无穷,这个题确实需要特殊处理。
问题
求数组的最大连续子序列
思路
dp
代码

int GreatestSum(vector<int> array)
{
    if (array.empty()) {
        return -1;
    }
    // F(i)初始化, F(0) = array[0]
    int sum = array[0];
    // maxsum初始化
    int maxsum = array[0];
    for (int i = 1; i < array.size(); i++) {
        // F(i) = max{F(i-1) + array[i],array[i]}
        sum = (sum > 0) ? sum + array[i] : array[i];
        // 寻找全局最大:maxsum = max( maxsum,F(i))
        maxsum = (sum < maxsum) ? maxsum : sum;
    }
    return maxsum;
}

PS:这个代码真的是相当精简

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值