179.最大数
给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。
示例 1:
输入:nums = [10,2]
输出:“210”
示例 2:
输入:nums = [3,30,34,5,9]
输出:“9534330”
示例 3:
输入:nums = [1]
输出:“1”
class Solution {
public:
string res;
static bool cmp(int a,int b){
string aa=to_string(a);
string bb=to_string(b);
int i=0,j=0;
string x=aa+bb;
string y=bb+aa;
if(x>y)return true;
return false;
}
string largestNumber(vector<int>& nums) {
sort(nums.begin(),nums.end(),cmp);
for(int i=0;i<nums.size();i++){
string num=to_string(nums[i]);
res+=num;
}
//是否全零
bool flag=true;
for(int i=0;i<nums.size();i++){
if(nums[i]==0)continue;
else{
flag=false;
break;
}
}
if(flag)return "0";
return res;
}
};
223.矩形面积
给你 二维 平面上两个 由直线构成的 矩形,请你计算并返回两个矩形覆盖的总面积。
每个矩形由其 左下 顶点和 右上 顶点坐标表示:
第一个矩形由其左下顶点 (ax1, ay1) 和右上顶点 (ax2, ay2) 定义。
第二个矩形由其左下顶点 (bx1, by1) 和右上顶点 (bx2, by2) 定义。
难得一遍过。。。
class Solution {
public:
int computeArea(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2) {
//不就是两个矩形的面积之和减去重合的面积吗
//先求出两个矩形重叠的面积
int width1=ax2-ax1;
int width2=bx2-bx1;
int height1=ay2-ay1;
int height2=by2-by1;
int area1=width1*height1;
int area2=width2*height2;
int res=area1+area2;
if(bx1>ax2||bx2<ax1||ay2<by1||ay1>by2){
//左右不重合上下也不重合
return res;
}
int left=max(ax1,bx1);
int right=min(ax2,bx2);
int up=min(ay2,by2);
int down=max(ay1,by1);
int areacha=(right-left)*(up-down);
return res-areacha;
}
};
239. 滑动窗口最大值
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回滑动窗口中的最大值。
示例 1:
输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
输出:[3,3,5,5,6,7]
解释:
滑动窗口的位置 最大值
[1 3 -1] -3 5 3 6 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7
瞎写的办法,没啥优化,然后还是超时了,只差三个案例就ac了,哎,水平不够。。。
class Solution {
public:
int record[2];
vector<int>res;
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
//试试能不能用空间换时间
if(nums.size()==1){
res.push_back(nums[0]);
return res;
}
int maxn=-10005;
for(int i=0;i<k;i++){
if(nums[i]>maxn){
maxn=nums[i];
record[0]=nums[i];
record[1]=i;
}
}
res.push_back(record[0]);
for(int i=1;i<nums.size()-k+1;i++){
// cout<<i<<endl;
int j=i+k-1;//新加入的那个数的下标
if(nums[j]>=record[0]){
record[0]=nums[j];
record[1]=j;
// res.push_back(nums[j]);
}else{
if(record[1]<i){
//最坏的一种情况
//不得不重新判断
int maxnum=-10005;
for(int p=i;p<=j;p++){
if(nums[p]>maxnum){
maxnum=nums[p];
record[0]=nums[p];
record[1]=p;
}
}
}
}
res.push_back(record[0]);
}
return res;
}
};
看了题解
用优先级队列。。。没啥可说的
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
int n = nums.size();
priority_queue<pair<int, int>> q;
for (int i = 0; i < k; ++i) {
q.emplace(nums[i], i);
}
vector<int> ans = {q.top().first};
for (int i = k; i < n; ++i) {
q.emplace(nums[i], i);
while (q.top().second <= i - k) {
q.pop();
}
ans.push_back(q.top().first);
}
return ans;
}
};