368. Largest Divisible Subset
注:中等题,不解释,浪费时间。faster than 100.00%。
417. Pacific Atlantic Water Flow
注:中等题,不解释,浪费时间。faster than 100.00%。
Rrui的Leetcode算法刷题笔记(九)链接如下:
https://blog.csdn.net/Rrui7739/article/details/84563790
371. 两整数之和
class Solution {
public:
int getSum(int a, int b) {
//按位取异或
int result = a^b;
//判断是否需要进位
int forward = (a&b) <<1;
if(forward!=0){
//如有进位,则将二进制数左移一位,进行递归
return getSum(result,forward);
}
return result;
}
};
374. 猜数字大小
// Forward declaration of guess API.
// @param num, your guess
// @return -1 if my number is lower, 1 if my number is higher, otherwise return 0
int guess(int num);
class Solution {
public:
int guessNumber(int n) {
long low=0,high=n;
while(1)
{
long mid=(low+high)/2;
if(guess(mid)==1)
low=mid+1;
else if(guess(mid)==-1)
high=mid-1;
else return mid;
}
}
};
377. 组合总和 Ⅳ
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
int N=nums.size();
sort(nums.begin(),nums.end());
int dp[target+1]={0};
dp[0]=1;
for(int i=1;i<=target;i++)
{
for(int j=0;j<N;j++)
{
// sum+=
// cout<<i<<" "<<j<<endl;
if(i>=nums[j])dp[i]+=dp[i-nums[j]];
else break;
}
}
//从小到大的顺序呢进行排列 然后每个数字都向前遍历
return dp[target];
}
};
378. 有序矩阵中第K小的元素
class Solution {
public:
int kthSmallest(vector<vector<int>>& matrix, int k) {
int n=matrix.size();
priority_queue<int> q;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
q.push(matrix[i][j]);
if(q.size()>k) q.pop();
}
}
return q.top();
}
};
380. 常数时间插入、删除和获取随机元素
class RandomizedSet {
public:
/** Initialize your data structure here. */
RandomizedSet() {}
/** Inserts a value to the set. Returns true if the set did not already contain the specified element. */
bool insert(int val) {
if (m.count(val)) return false;
nums.push_back(val);
m[val] = nums.size() - 1;
return true;
}
/** Removes a value from the set. Returns true if the set contained the specified element. */
bool remove(int val) {
if (!m.count(val)) return false;
int last = nums.back();
m[last] = m[val];
nums[m[val]] = last;
nums.pop_back();
m.erase(val);
return true;
}
/** Get a random element from the set. */
int getRandom() {
return nums[rand() % nums.size()];
}
private:
vector<int> nums;
unordered_map<int, int> m;
};
381. O(1) 时间插入、删除和获取随机元素 - 允许重复
class RandomizedCollection {
public:
/** Initialize your data structure here. */
RandomizedCollection() {}
/** Inserts a value to the collection. Returns true if the collection did not already contain the specified element. */
bool insert(int val) {
m[val].insert(nums.size());
nums.push_back(val);
return m[val].size() == 1;
}
/** Removes a value from the collection. Returns true if the collection contained the specified element. */
bool remove(int val) {
if (m[val].empty())
{
return false;
}
int idx = *m[val].begin();
m[val].erase(idx);
if (nums.size() - 1 != idx)
{
int t = nums.back();
nums[idx] = t;
m[t].erase(nums.size() - 1);
m[t].insert(idx);
}
nums.pop_back();
return true;
}
/** Get a random element from the collection. */
int getRandom() {
return nums[rand() % nums.size()];
}
private:
vector<int> nums;
unordered_map<int, unordered_set<int>> m;
};
382. 链表随机节点
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
/** @param head The linked list's head.
Note that the head is guaranteed to be not null, so it contains at least one node. */
Solution(ListNode* head) {
len=0;
this->head=head;
ListNode *cur=head;
while(cur)
{
++len;
cur=cur->next;
}
}
/** Returns a random node's value. */
int getRandom() {
int t=rand()%len;
ListNode *cur=head;
while(t)
{
--t;
cur=cur->next;
}
return cur->val;
}
private:
int len;
ListNode *head;
};
/**
* Your Solution object will be instantiated and called as such:
* Solution obj = new Solution(head);
* int param_1 = obj.getRandom();
*/
383. 赎金信
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
map<char,int> a;
for(int i=0;i<magazine.size();i++)
if(a.find(magazine[i])==a.end())
a.insert(pair<char,int>(magazine[i],1));
else a.find(magazine[i])->second++;
for(int i=0;i<ransomNote.size();i++)
if(a.find(ransomNote[i])==a.end())
return false;
else
{
if(a.find(ransomNote[i])->second<=0)
return false;
a.find(ransomNote[i])->second--;
}
return true;
}
};
384. 打乱数组
class Solution {
public:
Solution(vector<int> nums) : origin(nums) {}
/** Resets the array to its original configuration and return it. */
vector<int> reset() { return origin; }
/** Returns a random shuffling of the array. */
vector<int> shuffle() {
vector<int> res(origin);
int len = res.size();
for(int i = 0; i < res.size(); ++i){
int random = rand() % len;
int tmp = res[random];
res[random] = res[--len];
res[len] = tmp;
}
return res;
}
private:
vector<int> origin;
};
/**
* Your Solution object will be instantiated and called as such:
* Solution obj = new Solution(nums);
* vector<int> param_1 = obj.reset();
* vector<int> param_2 = obj.shuffle();
*/
385. 迷你语法分析器
/**
* // This is the interface that allows for creating nested lists.
* // You should not implement it, or speculate about its implementation
* class NestedInteger {
* public:
* // Constructor initializes an empty nested list.
* NestedInteger();
*
* // Constructor initializes a single integer.
* NestedInteger(int value);
*
* // Return true if this NestedInteger holds a single integer, rather than a nested list.
* bool isInteger() const;
*
* // Return the single integer that this NestedInteger holds, if it holds a single integer
* // The result is undefined if this NestedInteger holds a nested list
* int getInteger() const;
*
* // Set this NestedInteger to hold a single integer.
* void setInteger(int value);
*
* // Set this NestedInteger to hold a nested list and adds a nested integer to it.
* void add(const NestedInteger &ni);
*
* // Return the nested list that this NestedInteger holds, if it holds a nested list
* // The result is undefined if this NestedInteger holds a single integer
* const vector<NestedInteger> &getList() const;
* };
*/
class Solution {
public:
NestedInteger deserialize(string s) {
vector<int> a(1,0);
return sum(s,a);
}
NestedInteger sum(string s,vector<int>& a)
{
NestedInteger k;
vector<int> b;
int p=0,w=1;
bool j=false;
if(s[a[0]]=='['&&a[0]==0)
a[0]+=1;
for(int i=a[0];i<s.size();i++)
{
if(s[i]=='[')
{
a[0]=i+1;
NestedInteger p=sum(s,a);
k.add(p);
i=a[0];
}
while(i<s.size()&&(s[i]>='0'&&s[i]<='9'||s[i]=='-'))
{
if(s[i]=='-')
w=-1;
else p=10*p+(s[i]-'0')*w;
i++;
j=true;
}
if(j)
{
if(i>=s.size())
k.setInteger(p);
else k.add(p);
p=0;
w=1;
j=false;
}
if(i<s.size()&&s[i]==']')
{
a[0]=i+1;
return k;
}
}
return k;
}
};
386. 字典序排数
class Solution {
public:
vector<int> lexicalOrder(int n) {
vector<int> a;
lexi(n,a,1);
return a;
}
void lexi(int n,vector<int>& a,int k) {
if(k>n)
return ;
for(int i=0;i<=9;i++)
{
if(k+i==10&&k==1)
break;
a.push_back(k+i);
lexi(n,a,(k+i)*10);
if(k+i+1>n)
break;
}
}
};
387. 字符串中的第一个唯一字符
class Solution {
public:
int firstUniqChar(string s) {
unordered_map<char, int> m;
for (char c : s) ++m[c];
for (int i = 0; i < s.size(); ++i) {
if (m[s[i]] == 1) return i;
}
return -1;
}
};
388. 文件的最长绝对路径
class Solution {
public:
int lengthLongestPath(string input) {
int res = 0, n = input.size(), level = 0;
unordered_map<int, int> m {{0, 0}};
for (int i = 0; i < n; ++i) {
int start = i;
while (i < n && input[i] != '\n' && input[i] != '\t') ++i;
if (i >= n || input[i] == '\n') {
string t = input.substr(start, i - start);
if (t.find('.') != string::npos) {
res = max(res, m[level] + (int)t.size());
} else {
++level;
m[level] = m[level - 1] + (int)t.size() + 1;
}
level = 0;
} else {
++level;
}
}
return res;
}
};
389. 找不同
class Solution {
public:
char findTheDifference(string s, string t) {
sort(s.begin(),s.end());
sort(t.begin(),t.end());
for(long long i=0;i<s.size();i++)
if(s[i]!=t[i])
return t[i];
return t.back();
}
};
390. 消除游戏
public class Solution {
public int lastRemaining(int n) {
//将其镜像对折为一个子问题,当前状态可以推出的下一个状态的结果,但是相反
return n==1?1:2*(n/2 + 1 - lastRemaining(n/2));
}
}
391.完美矩形
392. 判断子序列
class Solution {
public:
bool isSubsequence(string s, string t) {
int zuobiao=0;
for(char i:s)
{
if(t.find(i,zuobiao)!=t.npos)
zuobiao=t.find(i,zuobiao)+1;
else return false;
}
return true;
}
};
393. UTF-8 编码验证
class Solution {
public:
bool validUtf8(vector<int>& data) {
int count = 0;
for(int num : data){
if(count == 0){
if((num>>5) == 0b110) count = 1;//2 byte
else if((num>>4) == 0b1110) count = 2;//3 byte;
else if((num>>3) == 0b11110) count = 3;//4 byte
else if((num>>7) == 1) return false;//count==0, occupy one byte
}else{
if((num>>6)!=0b10) return false;
count--;
}
}
return count == 0;
}
};
394. 字符串解码
class Solution {
public:
string decodeString(string s) {
vector<int> a{0};
return digui(s,0,a);
}
string digui(string s,int k,vector<int> &a){
int q=0;
string m;
for(int i=k;i<s.size();i++){
if(s[i]>='0'&&s[i]<='9')
q=10*q+s[i]-'0';
else if(s[i]=='[')
{
string b=digui(s,i+1,a);
while(q--)
m+=b;
q=0;
i=a[0];
}
else if(s[i]==']')
{
a[0]=i;
return m;
}
else
m.push_back(s[i]);
}
return m;
}
};
395. 至少有K个重复字符的最长子串
class Solution {
public:
int longestSubstring(string s, int k) {
return helper(s, k, 0, s.size() - 1);
}
int helper(string s, int k, int left, int right) {
int len = right - left + 1;
if (len <= 0) return 0;
int i, j;
int maxlen = 0;
vector<int> count(26, 0);
for (i = left; i <= right; i++) {
count[s[i] - 'a']++;
}
for (i = left, j = left; i <= right; i++) {
if (count[s[i] - 'a'] < k) {
maxlen = max(maxlen, helper(s, k, j, i - 1));
j = i + 1;
}
}
if (j == left) return len;
else return max(maxlen, helper(s, k, j, i - 1));
}
};
396. 旋转函数
class Solution {
public:
int maxRotateFunction(vector<int>& A) {
if(A.size()==0)
return 0;
int max2=INT_MIN;
for(int i=0;i<A.size();i++)
{
int max1=0,k=0;
for(int j=i;j-i<A.size();j++)
{
int p=j;
if(p>=A.size())
p=j-A.size();
max1+=k*A[p];
k++;
}
max2=max(max1,max2);
}
return max2;
}
};
397. 整数替换
class Solution {
public:
int integerReplacement(int n) {
if(n==1){
return 0;
}
if(n%2==0){
return integerReplacement(n/2)+1;
}
else{
if(n==INT_MAX){
return integerReplacement(n-1);
}
return min(integerReplacement(n-1)+1,integerReplacement(n+1)+1);
}
}
};
398. 随机数索引
class Solution {
public:
vector<int> a;
map<int,int> b;
Solution(vector<int> nums) {
a=nums;
for(int i=0;i<nums.size();i++)
if(b.find(nums[i])==b.end())
b.insert(pair<int,int>(nums[i],1));
else b.find(nums[i])->second++;
}
int pick(int target) {
int k=rand()%b.find(target)->second+1;
for(int i=0;i<a.size();i++)
if(a[i]==target)
if(!(--k))
return i;
}
};
/**
* Your Solution object will be instantiated and called as such:
* Solution obj = new Solution(nums);
* int param_1 = obj.pick(target);
*/
399. 除法求值
400. 第N个数字(不会)
class Solution {
public:
int findNthDigit(int n) {
int len = 1, base = 1;
while(n>9L*base*len){
n -= 9*base*len;
len++;
base *= 10;
}
int curNum = (n-1)/len + base, digit = 0;
for(int i=(n-1)%len;i<len;++i){
digit = curNum%10;
curNum /= 10;
}
return digit;
}
};
class Solution {
public:
int findNthDigit(int n) {
int i=1,j=1,k=0,q=0;
while(k+9*i*j<n)
{
k=k+9*i*j;
q=q+9*i;
j++;
i=10*i;
}
int p=n-k;
return p%j==0?(q+p/j)%10:int((q+p/j+1)/pow(10,j-1-p%j))%10;
}
};
401. 二进制手表
402. 移掉K位数字(超时)
class Solution {
public:
string removeKdigits(string num, int k) {
return digui(num,k,0,0);
}
string digui(string num, int k,int p,int q){
if(q>k)
return num;
if(q)
num.erase(num.begin()+p);
if(num.size()==0)
return "0";
int b=INT_MAX;
for(int i=0;i<num.size();i++)
b=min(b,atoi(digui(num,k,i,q+1).c_str()));
return to_string(b);
}
};
class Solution {
public:
string removeKdigits(string num, int k) {
int n = num.size(),top = 0,count = 0; //count用来记录删除的次数
if(k==n) return "0"; //如果k等于num的长度则直接返回"0"
for(int i = 0;i<n;i++)
{
while(top>0&&num[top-1]>num[i]&&count<k) //如果前一个数字比当前的数字大,则top又回到前一个数的位置
{
top--;
count++;
}
num[top++] = num[i];
}
//上面的循环操作结束后会存在两种情况,1:通过上面的循环操作已经把k个数都删完了。2:通过上面的循环操作还没把k个数全部删完
top = min(top,n-k); //情况1则top = top;情况2则top = n-k;(top表示字符串最后一位的下一位)
int i = 0;
for(;i<top;i++) //把前面有0的去除
if(num[i]!='0') break;
if(i==top) return "0"; //剩下的全部为零
string res = "";
for(;i<top;i++)
res+=num[i];
return res;
}
};
404. 左叶子之和
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int sumOfLeftLeaves(TreeNode* root) {
queue<TreeNode*> q;
q.push(root);
int sum = 0;
while(!q.empty()){
TreeNode* temp = q.front();
q.pop();
if(temp == NULL) break;
if(temp->left) {
q.push(temp->left);
if(temp->left->left == NULL && temp->left->right == NULL) sum += temp->left->val;
}
if(temp->right) q.push(temp->right);
}
return sum;
}
};
405. 数字转换为十六进制数
409. 最长回文串
class Solution {
public:
int longestPalindrome(string s) {
map<char,int> a;
bool k=false;
for(char b:s)
{
if(a.find(b)==a.end())
a.insert(pair<char,int>(b,1));
else a.find(b)->second++;
}
int sum=0;
for(map<char,int>::iterator i=a.begin();i!=a.end();i++)
{
if(i->second%2==0)
sum+=i->second;
else
{
if(i->second/2!=0)
sum+=(i->second/2)*2;
k=true;
}
}
return k?++sum:sum;
}
};
412. Fizz Buzz
class Solution {
public:
vector<string> fizzBuzz(int n) {
vector<string> a{"Fizz","Buzz","FizzBuzz"};
vector<string> b;
for(int i=1;i<=n;i++)
{
if(!(i%3)||!(i%5))
{
if(!(i%3)&&!(i%5))
b.push_back(a[2]);
else if(!(i%3))
b.push_back(a[0]);
else b.push_back(a[1]);
}
else
b.push_back(to_string(i));
}
return b;
}
};
413. 等差数列划分(超时)
class Solution {
public:
int numberOfArithmeticSlices(vector<int>& A) {
int sum=0;
for(int i=0;i+1<A.size();i++)
{
int d=A[i]-A[i+1],k=1;
for(int j=i;j+1<A.size();j++)
{
if(d==A[j]-A[j+1])
{
k++;
if(k>=3)
sum++;
}
else
{
d=A[j]-A[j+1];
k=1;
}
}
}
return sum;
}
};
class Solution {
public:
int numberOfArithmeticSlices(vector<int>& A) {
int sum = 0,count = 0;
for(int i=2;i<A.size();i++){
if(A[i] - A[i-1] == A[i-1] - A[i-2]){
count++;
sum += count;
}else{
count = 0;
}
}
return sum;
}
};
414. 第三大的数
class Solution {
public:
int thirdMax(vector<int>& nums) {
set<int>s;
for(int i=0;i<nums.size();i++){
s.insert(nums[i]);
if(s.size()>3){
s.erase(s.begin());
}
}
return s.size()==3?*s.begin():*s.rbegin();
}
};
415. 字符串相加
class Solution {
public:
string addStrings(string num1, string num2) {
int i=0,k=0,d=0;
string s;
reverse(num1.begin(),num1.end());
reverse(num2.begin(),num2.end());
while(i<=max(num1.size(),num2.size()))
{
int c;
char a='0',b='0';
if(i<num1.size())
a=num1[i];
if(i<num2.size())
b=num2[i];
c=d+a-'0'+b-'0';
d=c/10;
c%=10;
s+=to_string(c);
i++;
}
if(s.back()=='0')
s.erase(s.begin()+s.size()-1);
reverse(s.begin(),s.end());
return s;
}
};
416. 分割等和子集
421. 数组中两个数的最大异或值
class Solution {
public:
int findMaximumXOR(vector<int>& nums) {
int max = 0, mask = 0;
for (int i = 31; i >= 0; i--) {
set<int> set;
mask = mask | (1 << i);
for (int num : nums) {
set.insert(num & mask);
}
int temp = max | (1 << i);
for (int element : set) {
if (set.find(element ^ temp) != set.end()) {
max = temp;
break;
}
}
}
return max;
}
};
423. 从英文中重建数字
class Solution {
public:
string originalDigits(string s)
{
int a[10]={0};
int n=s.length();
map<char,int> dic;
for(int i=0;i<n;i++)
{
if(dic.count(s[i])<1)
{
dic.insert(pair<char,int>(s[i],1));
}
else
{
dic[s[i]]+=1;
}
}
for(int i=0;i<n;i++)
{
if(s[i]=='z')
{
a[0]++;
dic['e']--;
dic['r']--;
dic['o']--;
}
if(s[i]=='w')
{
a[2]++;
dic['t']--;
dic['o']--;
}
if(s[i]=='u')
{
a[4]++;
dic['f']--;
dic['o']--;
dic['r']--;
}
if(s[i]=='x')
{
a[6]++;
dic['s']--;
dic['i']--;
}
if(s[i]=='g')
{
a[8]++;
dic['e']--;
dic['i']--;
dic['h']--;
dic['t']--;
}
}
a[1]=dic['o'];
a[3]=dic['t'];
a[5]=dic['f'];
a[7]=dic['s'];
a[9]=dic['i']-dic['f'];
string res;
for(int i=0;i<10;i++)
{
//for(int j=0;j<a[i];j++)
//{
// res.push_back(i+'0');
//}
res.insert(res.end(),a[i],i+'0');
}
return res;
}
};
424. 替换后的最长重复字符
class Solution {
public:
int characterReplacement(string s, int k) {
int res = 0, maxCnt = 0, start = 0;
vector<int> counts(26, 0);
for (int i = 0; i < s.size(); ++i) {
maxCnt = max(maxCnt, ++counts[s[i] - 'A']);
while (i - start + 1 - maxCnt > k) {
--counts[s[start] - 'A'];
++start;
}
res = max(res, i - start + 1);
}
return res;
}
};
430. 扁平化多级双向链表
/*
// Definition for a Node.
class Node {
public:
int val = NULL;
Node* prev = NULL;
Node* next = NULL;
Node* child = NULL;
Node() {}
Node(int _val, Node* _prev, Node* _next, Node* _child) {
val = _val;
prev = _prev;
next = _next;
child = _child;
}
};
*/
class Solution {
public:
Node* flatten(Node* head) {
Node *p= head;
while(p)
{
Node *q;
if(p->child)
{
q=p->next;
Node *m=flatten(p->child);
p->child=NULL;
p->next=m;
m->prev=p;
while(m->next)
m=m->next;
m->next=q;
if(q)
q->prev=m;
}
p=p->next;
}
return head;
}
};
433. 最小基因变化
434. 字符串中的单词数
class Solution {
public:
int countSegments(string s) {
int num=0;
for(int i=0;i<s.size();i++)
{
if(s[i]!=' ')
{
num++;
while(i<s.size()&&s[i]!=' ')
i++;
}
}
return num;
}
};
435. 无重叠区间
436. 寻找右区间
437. 路径总和 III
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int pathSum(TreeNode* root, int sum) {
if(root == NULL) {
return 0;
}
int res = 0;
res += dfs(root, sum);
res += pathSum(root->left, sum);
res += pathSum(root->right, sum);
return res;
}
private:
int dfs(TreeNode* root, int num) {
if(root == NULL) {
return 0;
}
int res = 0;
if(root->val == num) {
res += 1;
}
res += dfs(root->left, num - root->val);
res += dfs(root->right, num - root->val);
return res;
}
};
438. 找到字符串中所有字母异位词
class Solution {
private:
vector<int>result;
public:
vector<int> findAnagrams(string s, string p)
{
if(s.size()==0||p.size()==0)
return result;
vector<int>vs(26,0);//用数组来创建两个哈希表;
vector<int>vp(26,0);
//主要的内容;
for(char c:p)//遍历p字符串;结果存入到vp中;存入的是数字;
vp[c-'a']++;
//主要的算法内容;
for(int i=0;i<s.size();i++)//遍历给定的要查找的字符串;
{
if(i>=p.size())//如果说此时的下标大于滑动窗口的长度;
vs[s[i-p.size()]-'a']--;
vs[s[i]-'a']++;//将当前的字符加入到滑动窗口中;
if(vs==vp)//注意这里只比较数组的内容并不需要比较顺序;
result.push_back(i-p.size()+1);
}
return result;
}
};
440. 字典序的第K小数字 (超时)
class Solution {
public:
int findKthNumber(int n, int k) {
vector<long> a(1,k);
vector<long> b(1,0);
digui(n,a,1,k,b);
return b[0];
}
void digui(int n,vector<long> &a,long p,int k,vector<long> &b){
if(p>n)
return ;
for(int i=0;i<=9;i++)
{
if(p+i==10&&p!=10)
break;
a[0]--;
b[0]=p+i;
if(a[0]==0)
return ;
digui(n,a,(p+i)*10,k,b);
if(a[0]==0)
return ;
if(p+i+1>n)
break;
}
}
};
441. 排列硬币
class Solution {
public:
int arrangeCoins(int n) {
int i=1;
while(n>=i)
{
n-=i;
i++;
}
return --i;
}
};
442. 数组中重复的数据
class Solution {
public:
vector<int> findDuplicates(vector<int>& nums) {
vector<int> res;
for(int i=0;i<nums.size();++i){
int idx=abs(nums[i])-1;
if(nums[idx]<0) res.push_back(idx+1);
nums[idx]=-nums[idx];
}
return res;
}
};
443. 压缩字符串
class Solution {
public:
int compress(vector<char>& chars) {
char a=chars[0];
int i=1;
while(i<chars.size())
{
int k=1,p=0;
while(i<chars.size()&&a==chars[i])
{
chars.erase(chars.begin()+i);
k++;
}
if(i<chars.size())
a=chars[i];
if(k!=1)
{
while(k)
{
chars.insert(chars.begin()+i,k%10+'0');
k/=10;
p++;
}
}
i=i+p+1;
}
return chars.size();
}
};
445. 两数相加 II
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
{
ListNode *dummy=new ListNode(0);
if(!l1)return l2;
if(!l2)return l1;
ListNode *cur=dummy;
ListNode *p1=l1;
ListNode *p2=l2;
stack<int>stk1,stk2;
while(p1)
{
stk1.push(p1->val);
p1=p1->next;
}
while(p2)
{
stk2.push(p2->val);
p2=p2->next;
}
int sum=0;
int overload=0;
while(stk1.size()||stk2.size()||sum)
{
if(stk1.size())
{
sum+=stk1.top();
stk1.pop();
}
if(stk2.size())
{
sum+=stk2.top();
stk2.pop();
}
ListNode *temp=new ListNode(sum%10);
sum/=10;
overload=sum;
temp->next=cur->next;
cur->next=temp;
//cur=cur->next;
}
return dummy->next;
}
};
446. 等差数列划分 II - 子序列
447. 回旋镖的数量
class Solution {
public:
int numberOfBoomerangs(vector<pair<int, int>>& points)
{
int res = 0;
for (int i = 0; i < points.size(); ++i)
{
unordered_map<int, int> m;
for (int j = 0; j < points.size(); ++j)
{
int a = points[i].first - points[j].first;
int b = points[i].second - points[j].second;
++m[a * a + b * b];
}
for (auto it = m.begin(); it != m.end(); ++it)
{
res += it->second * (it->second - 1);
}
}
return res;
}
};
448. 找到所有数组中消失的数字
class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
vector<int> res;
for (int i = 0; i < nums.size(); ++i) {
int idx = abs(nums[i]) - 1;
nums[idx] = (nums[idx] > 0) ? -nums[idx] : nums[idx];
}
for (int i = 0; i < nums.size(); ++i) {
if (nums[i] > 0) {
res.push_back(i + 1);
}
}
return res;
}
};
479. 最大回文数乘积
class Solution {
public:
int largestPalindrome(int n) {
int upper = pow(10, n) - 1, lower = upper / 10;
for (int i = upper; i > lower; --i) {
string t = to_string(i);
long p = stol(t + string(t.rbegin(), t.rend()));
for (long j = upper; j * j > p; --j) {
if (p % j == 0) return p % 1337;
}
}
return 9;
}
};
482. 密钥格式化
class Solution {
public:
string licenseKeyFormatting(string S, int K) {
string s,p="-";
int sum=0;
for(int i=S.size()-1;i>=0;i--)
{
if(S[i]=='-')
continue;
if((S[i]>='A'&&S[i]<='Z')||(S[i]>='0'&&S[i]<='9'))
s+=S[i];
else s.push_back(S[i]-32);
sum++;
if(sum==K)
{
s+=p;
sum=0;
}
}
if(s.back()=='-')
s.erase(s.begin()+s.size()-1);
reverse(s.begin(),s.end());
return s;
}
};
注:题目较简单,从后到前遍历一遍后再翻转即可,时间复杂度O(n),空间复杂度O(n)。超过99.56%,用时20min(理解题意理解错了。。除了第一个组合我以为第一个组合不用改,结果空在那想。。)。
485. 最大连续1的个数
class Solution {
public:
int findMaxConsecutiveOnes(vector<int>& nums) {
int max=0,sum=0;
for(int i=0;i<nums.size();i++)
{
if(nums[i]==0)
sum=0;
else
{
sum++;
max=max>sum?max:sum;
}
}
return max;
}
};
注:题目较简单,从前到后遍历一遍即可,时间复杂度O(n),空间复杂度O(1)。超过95.24%,用时5min。
492. 构造矩形
class Solution {
public:
vector<int> constructRectangle(int area) {
vector<int> res;
int x = sqrt(area);
for(int i=x;i<=area;i++){
if(area%i==0&&i>=area/i){
res.push_back(i);
res.push_back(area/i);
break;
}
}
return res;
}
};
496. 下一个更大元素 I
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& findNums, vector<int>& nums) {
vector<int> a;
for(int i=0;i<findNums.size();i++)
{
for(int j=0;j<nums.size();j++)
{
if(nums[j]==findNums[i])
for(int k=j;k<nums.size();k++)
{
if(nums[k]>nums[j])
{
a.push_back(nums[k]);
break;
}
if(k==nums.size()-1)
a.push_back(-1);
}
}
}
return a;
}
};
500. 键盘行
class Solution {
public:
vector<string> findWords(vector<string>& words) {
vector<string> res;
unordered_set<char> row1 {'q','w','e','r','t','y','u','i','o','p','Q','W','E','R','T','Y','U','I','O','P'};
unordered_set<char> row2{'a','s','d','f','g','h','j','k','l','A','S','D','F','G','H','J','K','L'};
unordered_set<char> row3{'z','x','c','v','b','n','m','Z','X','C','V','B','N','M'};
for(string word : words) {
int a = 0;
int b = 0;
int c = 0;
for(char ch : word) {
if(row1.count(ch)) a = 1;
else if(row2.count(ch)) b = 1;
else if(row3.count(ch)) c = 1;
if(a + b + c > 1) break;
}
if(a + b + c == 1) res.push_back(word);
}
return res;
}
};
501. 二叉搜索树中的众数
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> res;
int mx = 0, cnt = 1;
vector<int> findMode(TreeNode* root) {
TreeNode* pre = NULL;
inorder(root, pre);
return res;
}
void inorder(TreeNode* node, TreeNode*& pre) {
if(!node) {
return ;
}
inorder(node->left, pre);
if(pre) {
cnt = (node->val == pre->val) ? cnt + 1 : 1;
}
if(cnt >= mx) {
if(cnt > mx) {
res.clear();
}
res.push_back(node->val);
mx = cnt;
}
pre = node;
inorder(node->right, pre);
}
};
503. 下一个更大元素 II
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
vector<int> a;
for(int i=0;i<nums.size();i++)
{
for(int j=i+1;j-i-1<nums.size();j++)
{
int p=j;
if(j>=nums.size())
p=j-nums.size();
if(nums[p]>nums[i])
{
a.push_back(nums[p]);
break;
}
if(p==i)
a.push_back(-1);
}
}
return a;
}
};
504. 七进制数
class Solution {
public:
string convertToBase7(int num) {
string k;
if(num==0)
return "0";
int p=num>0?1:-1;
num=abs(num);
while(num)
{
k+=to_string(num%7);
num/=7;
}
if(p==-1)
k+="-";
reverse(k.begin(),k.end());
return k;
}
};
506. 相对名次
class Solution {
public:
vector<string> findRelativeRanks(vector<int>& nums) {
vector<int> a=nums;
vector<string> b(nums.size(),"0"),d{"Gold Medal", "Silver Medal", "Bronze Medal"};
int k=1;
sort(a.begin(),a.end());
map<int,int> c;
for(int i=0;i<nums.size();i++)
c[nums[i]]=i;
for(int i=nums.size()-1;i>=0;i--)
{
if(k<4)
{
b[c.find(a[i])->second]=d[nums.size()-i-1];
}
else b[c.find(a[i])->second]=to_string(k);
k++;
}
return b;
}
};