问题
给定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:这个代码真的是相当精简