56. 滑动窗口的最大值
这题我觉得最麻烦的是,size使用的 unsigned int的类型,导致后面有点麻烦,所以我直接转成int型了。
class Solution {
public:
vector<int> maxInWindows(const vector<int>& num, unsigned int size)
{
string str=to_string(size);
int s=atoi(str.c_str());
if(num.size()<=0 || s<=0 || s>num.size()) return {};
if(s==1) return num;
vector<int> res;
int maxindex=0;
for(int j=1;j<s && j<num.size();j++)
maxindex=num[maxindex]>num[j]?maxindex:j;
res.push_back(num[maxindex]);
for(int i=s;i<num.size();i++){
if(num[i]>=num[maxindex]){
maxindex=i;
res.push_back(num[maxindex]);
}
else{
if(maxindex!=i-s)
res.push_back(num[maxindex]);
else{
maxindex=i-s+1;
for(int j=i-s+2;j<=i;j++)
maxindex=num[maxindex]>num[j]?maxindex:j;
res.push_back(num[maxindex]);
}
}
}
return res;
}
};
书上的思路,我写的有点混乱。
思想是index.front()永远是序列最大值
如果当前值比之前的最大值大,那么清空index,存入当前的下标
如果当前值小,那么比较当前值与index中末尾值的大小。若当前值大则删去末尾值,直到末尾值大于当前值,插入当前值
当最大值即index的第一个位置的值已不在序列范围内,删除该值。
class Solution {
public:
vector<int> maxInWindows(const vector<int>& num, unsigned int size)
{
string str=to_string(size);
int s=atoi(str.c_str());
if(num.size()<=0 || s<=0 || s>num.size()) return {};
if(s==1) return num;
vector<int> res;
deque<int> index;
index.push_back(0);
for(int i=1;i<num.size();i++){
if(index.front()<=i-s) index.pop_front();
if(num[i]>=num[index.front()]){
index.clear();
index.push_back(i);
}
else{
while(index.size()>0 && num[i]>num[index.back()])
index.pop_back();
index.push_back(i);
}
if(i>=s-1)
res.push_back(num[index.front()]);
}
return res;
}
};
57. 扑克牌顺子
自己的想法,先冒泡排序,再根据0的数量判断顺子是否成立。
class Solution {
public:
void swap(vector<int> &numbers,int i,int j){
int temp=numbers[i];
numbers[i]=numbers[j];
numbers[j]=temp;
}
bool IsContinuous( vector<int> numbers ) {
if(numbers.size()!=5) return false;
//排序
for(int i=4;i>0;i--){
for(int j=0;j<i;j++){
if(numbers[j]>numbers[j+1])
swap(numbers,j,j+1);
}
}
//0
int count0=0,index=0,temp=1;
while(index<4){
if(numbers[index]==0){
count0++;
index++;
}
else{
if(numbers[index+1]==numbers[index]+temp){
temp=1;
index++;
}
else{
if(count0>0){
count0--;
temp++;
}
else return false;
}
}
}
return true;
}
};
58. 孩子们的游戏(圆圈中最后剩下的数)
直接按照题目的思路用链表写的代码,一直以来很害怕链表,改了两下就成功了相当开心。
class Solution {
public:
int LastRemaining_Solution(int n, int m)
{
if(n<1 || m<1) return -1;
ListNode* phead=new ListNode(0);
phead->next=NULL;
ListNode* head=phead;
ListNode* temp;
for(int i=1;i<n;i++){
temp=new ListNode(i);
head->next=temp;
head=head->next;
}
head->next=phead;
head=head->next;
int count=0;
while(head!=NULL){
if(count==m-2){
if(head==head->next->next){
head->next=NULL;
break;
}
else
head->next=head->next->next;
count=-1;
}
head=head->next;
count++;
}
return head->val;
}
};
59. 求1+2+3+4+~+n
class Solution {
public:
int Sum_Solution(int n) {
//短路求值,与的判断条件下,当前面的条件判断不符合,后面将不计算。
int res=n;
res && (res+=Sum_Solution(n-1));
return res;
}
};
60. 不用加减乘除做加法
class Solution {
public:
int Add(int num1, int num2)
{
if(num1==num2) return num1<<1;
//以 异或 算出 不进位的和
//以 与 算出进位的位置
int sum,carry;
while(num2!=0){
//当不再有进位时停止
sum=num1^num2;
carry=(num1&num2)<<1;
num1=sum;
num2=carry;
}
return num1;
}
};