这题最简单,不需要题解,暴力就好了
这道题目,脑子转过弯了就好说。
1.其实就是比大小变种。如果这个数比另一个数大这个就占据不到0号位子,之后他永远抢不回0号位子
2.如果比到最后了,那么这个数字必定是最大的。前面没有出现冠军的话。
class Solution {
public:
int getWinner(vector<int>& arr, int k) {
if(k>=arr.size())
{
int tmp = arr[0];
for(int i = 1;i<arr.size();i++)
if(tmp<arr[i])
tmp = arr[i];
return tmp;
}
int tmp = arr[0];int index = 0;
int sum = 0;
for(int i = 1;i<arr.size();i++)
{
if(arr[i]>tmp){
tmp = arr[i];//如果比他大,更新一下
index = i;
sum = 1;
}
else
{
sum++;
}
if(sum>=k)
return tmp;
}
return tmp;//比到最后了,这个必定是最大值。
}
};
这个一时间看错题目了。
这个题目:
1.找到后缀开始,变到一维数组里面保存
2.从最大的地方开始,也就是说:从第一个开始。
3.找最近最好的,如果没有弹出来
class Solution {
public:
int minSwaps(vector<vector<int>>& grid) {
int n = grid.size();
vector<int> a;
for(int i = 0;i<n;i++)
{
int sum = 0;
for(int j = n-1;j>=0;j--)
{
if(grid[i][j]==0)sum++;
else
break;
}
a.push_back(sum);
}//统计一下后缀0
int sum = 0;//答案
for(int i = 0;i<n-1;i++)
{
if(a[i] >= n - i - 1)continue;
else
{
bool ppp = 0;//标记
int j;
for(j = i;j<n;j++)
{
if(a[j]>=n-i-1)
{
ppp = 1;
break;
}
}
if(ppp==0)
return -1;
for(;j>i;j--)
{
swap(a[j],a[j-1]);//交换一下,模拟一下
sum++;
}
}
}
return sum ;
}
};
这个题目比较灵活,但是一看到就知道是DP,但是本人比较菜。喜欢别的方法
1.第一这个是有序的(比赛的时候,一直没注意到这个问题)
2.我们统计每一段的值,如果可以选择的话,我们选最大值
2.1.首先我们将可以交换的地方作为起点,将下一个可以交换的地方作为结束点
2.2.先统计这一段的值,然后在比较,选这段的最大值
2.3.一直重复
class Solution {
public:
int maxSum(vector<int>& nums1, vector<int>& nums2) {
int n1 = nums1.size(),n2=nums2.size();
long sum1 = 0, sum2 = 0;
long res = 0;
int i = 0, j = 0;
while(i < n1&& j < n2){
if(nums1[i] == nums2[j]){
res += (max(sum1, sum2) + nums1[i]);//选择最大值
sum1 = 0;//两个清零
sum2 = 0;
i++;
j++;
}
else if(nums1[i] < nums2[j]){
sum1 += nums1[i];//统计值
i++;
}
else{
sum2 += nums2[j];//统计值
j++;
}
}
//其中必有一个长的还没有统计完,最后在统计好
while(i < n1){
sum1 += nums1[i];
i++;
}
while(j < n2){
sum2 += nums2[j];
j++;
}
res += max(sum1, sum2);
return res % ((int)pow(10, 9) + 7 );
}
};