注:编程语言C++,部分代码参考大佬,地址略。
1.两数之和
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int a=nums.size();
for (int i=0;i<a;i++)
for(int j=i+1;j<a;j++)
{
if (nums[i]+nums[j]==target)
return {i,j};
}
}
};
2. 两数相加
/**
* 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 *d=new ListNode(0);
ListNode *b=l1;
ListNode *c=l2;
ListNode *a=d;
int jinwei=0;
while((b!=NULL)||(c!=NULL))
{
int x= b!=NULL?b->val:0;
int y= c!=NULL?c->val:0;
int sum=x+y+jinwei;
jinwei=sum/10;
//a->val=a->val+sum%10;
a->next=new ListNode(sum%10);
a=a->next;
if (b != NULL) b = b->next;
if (c != NULL) c = c->next;
}
if (jinwei>0)
a->next=new ListNode(jinwei);
return d->next;
}
};
3. 无重复字符的最长子串
class Solution {
public:
int lengthOfLongestSubstring(string s) {
set<char> a;
int left=0,right=0,max=0;
while(right<s.size())
{
if(a.find(s[right])==a.end())
{
a.insert(s[right++]);
if (a.size()>max)
max=a.size();
}
else
a.erase(s[left++]);
}
return max;
}
};
4.两个排序数组的中位数
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int a=nums1.size();
int b=nums2.size();
nums1.push_back(INT_MAX);
nums2.push_back(INT_MAX);
int c=(a+b)%2==0?1:0;
int*d=new int[a+b];
int j=0;
int p=0;
for (int i = 0; i<a + b; i++)
{
if (nums1[j] <= nums2[p])
{
d[i] = nums1[j];
j++;
}
else
{
d[i] = nums2[p];
p++;
}
}
int k=(a+b)/2;
if(c)
{
return (double(d[k])+d[k-1])/2;
}
else
return d[k];
}
};
5. 最长回文子串
class Solution {
public:
string longestPalindrome(string s) {
//寻找最长回文子串
int size = s.size();
if (size <= 1) return s;
//用动态规划方法
//dp为size*size大小的矩阵,dp[i][j]表示以s[i]开头,s[j]结尾的回文串长度(如果不是回文串,则为0)
vector<vector<int>> dp(size);
for (int i = 0; i<size; i++) {
for (int j = 0; j<size; j++) {
//初始化,将对角线元素设为1
if(i==j) dp[i].push_back(1);
else dp[i].push_back(0);
}
}
int start = 0, max = 1;
for (int j = 0; j < size;j++){
for (int i = j - 1; i >= 0; i--) {
if (s[i] == s[j]) {
if(j-i==1) dp[i][j] = 2;
else {
if (dp[i + 1][j - 1]>0) {
dp[i][j] = dp[i + 1][j - 1] + 2;
}
else dp[i][j] = 0;
}
}
else dp[i][j] = 0;
if (dp[i][j]>max) {
max = dp[i][j]; start = i;
}
}
}
return s.substr(start, max);
}
};
6.Z字形变换
class Solution {
public:
string convert(string s, int numRows) {
if (numRows==1)
return s;
int n=s.size();
int step=2*numRows-2;
string k;
for(int i=0;i<numRows;i++)
for(int j=0;j+i<n;j+=step)
{
k+=s[i+j];
if((i<numRows-1)&&(i>0)&&(j + step - i <n))
{
k+=s[j + step - i ];
}
}
return k;
}
};
7. 反转整数
class Solution {
public:
int reverse(int x) {
int a=0;
while(x)
{
if (a > INT_MAX/10 || a < INT_MIN/10 ) return 0;
a=10*a+x%10;
x=x/10;
}
return a;
}
};
8. 字符串转整数 (atoi)
class Solution {
public:
int myAtoi(string str) {
int a=str.size();
long long b=0;
int kk=0;
int sign=0;
int p=0;
int o=0;
int u=0;
for(int i=0;i<a;i++)
{
if(str[i]==' '&&p==0)
continue;
if((str[i]<'0'||str[i]>'9')&&str[i]!='-'&&str[i]!='+')
break;
else if(str[i]=='-')
{
if(u>0)
break;
kk=1;
p++;
sign++;
continue;
}
else if(str[i]=='+')
{
if(u>0)
break;
kk=0;
p++;
sign++;
continue;
}
else if (sign>1)
return 0;
else
{
b=10*b+(str[i]-'0');
u++;
p++;
if(b>=2147483648)
{
o=1;
break;
}
}
}
if(kk==1)
{
if(o==1)
b=-2147483648;
b=-b;
}
else
{
if(o==1)
b=2147483648-1;
}
return b;
}
};
9. 回文数
class Solution {
public:
bool isPalindrome(int x) {
if (x<0)
return false;
int k=x;
int p=0;
while(k)
{
p=10*p+k%10;
k=k/10;
}
if(p==x)
return true;
else return false;
}
};
10. 正则表达式匹配
11. 盛最多水的容器
class Solution {
public:
int maxArea(vector<int>& height) {
int a=height.size();
int b=0,c=a-1,max=0;
while(b<c)
{
if(((c-b)*min(height[b],height[c]))>max)
max=(c-b)*min(height[b],height[c]);
if(height[b]>height[c])
c--;
else b++;
}
return max;
}
};
12. 整数转罗马数字
class Solution {
public:
string intToRoman(int num) {
string a;
string b[15] = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
int c[15] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
int i=0;
while(num)
{
if((num-c[i])>=0)
{
a+=b[i];
num=num-c[i];
}
else i++;
}
return a;
}
};
13. 罗马数字转整数
class Solution {
public:
int romanToInt(string s) {
int tagVal[256];
tagVal['I'] = 1;
tagVal['V'] = 5;
tagVal['X'] = 10;
tagVal['C'] = 100;
tagVal['M'] = 1000;
tagVal['L'] = 50;
tagVal['D'] = 500;
int val = 0;
for(int i = 0; i < s.length(); i++){
if(i+1 >= s.length() || tagVal[s[i+1]] <= tagVal[s[i]])
val += tagVal[s[i]];
else
val -= tagVal[s[i]];
}
return val;
}
};
14. 最长公共前缀
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if (strs.size() == 0)
return string();
else if (strs.size() == 1)
return strs[0];
string str;
for(int i=0;i<INT_MAX;i++)
{
for(int j=1;j<strs.size();j++)
{
if(strs[j][i]!=strs[0][i]||i>=strs[0].size())
{
return str;
}
}
str+=strs[0][i];
}
return str;
}
};
15. 三数之和
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
if(nums.size() < 3)
return res;
vector<int> v;
sort(nums.begin(), nums.end());
int sum = -1;
for(int i = 0; i < nums.size() - 2; i++){
if(nums[i] <= 0){
v.push_back(nums[i]);
if(sum == 0 - nums[i]){
v.pop_back();
continue;
}
sum = 0 - nums[i];
int f = i + 1, l = nums.size() - 1;
int di = nums[f] - 1;
while(f < l){
if(nums[f] + nums[l] == sum){
if(di != nums[f]){
v.push_back(nums[f]);
v.push_back(nums[l]);
res.push_back(v);
v.pop_back();
v.pop_back();
di = nums[f];
}
f++;l--;
}
else if(nums[f] + nums[l] < sum)
f++;
else if(nums[f] + nums[l] > sum)
l--;
}
v.pop_back();
}
}
return res;
}
};
16. 最接近的三数之和
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
if(nums.size() <= 3)
{
int result = 0;
for(int i = 0; i < nums.size(); i ++)
{
result += nums[i];
}
return result;
}
sort(nums.begin(), nums.end());
int sum = nums[0] + nums[1] + nums[2];
for(int i = 0; i < nums.size(); i ++)
{
int left = i + 1, right = nums.size() - 1;
while(left < right)
{
int current = nums[left] + nums[right] + nums[i];
if(abs(target - current) < abs(target - sum))
{
sum = current;
if(sum == target)
return sum;
}
if(current > target)
right --;
else
left ++;
}
}
return sum;
}
};
17. 电话号码的字母组合
class Solution {
public:
vector<string> letterCombinations(string digits) {
vector<string> a;
string str;
vector<string> b;
char c;
string s[8] = { "abc","def","ghi","jkl","mno","pqrs","tuv","wxyz" };
bool k=true;
for(int i=0;i<digits.size();i++)
{
if (digits[i]=='0'||digits[i]=='1')
continue;
for(int j=0;j<s[digits[i]-'2'].size();j++)
{
if(k)
{
str.push_back(s[digits[i]-'2'][j]);
a.push_back(str);
str.pop_back();
}
else
for(int k=0;k<a.size();k++)
{
str.push_back(s[digits[i]-'2'][j]);
b.push_back(a[k]+str);
str.pop_back();
}
}
if(!k)
{
a.clear();
for(int k=0;k<b.size();k++)
{
a.push_back(b[k]);
}
b.clear();
}
k=false;
}
return a;
}
};
18. 四数之和
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
int a=nums.size();
int k,p,sum;
vector<vector<int>> b;
vector<int> c;
sort(nums.begin(),nums.end());
for(int i=0;i<a-3;i++)
{
for(int j=i+1;j<a-2;j++)
{
sum=target-nums[i]-nums[j];
k=j+1;p=a-1;
while(k<p)
{
if(nums[k]+nums[p]==sum)
{
c.push_back(nums[i]);
c.push_back(nums[j]);
c.push_back(nums[k]);
c.push_back(nums[p]);
b.push_back(c);
c.clear();
k++;
p--;
while(k<p&&nums[p]==nums[p+1])
p--;
while(k<p&&nums[k]==nums[k-1])
k++;
}
else if(nums[k]+nums[p]<sum)
{
k++;
}
else p--;
}
while(j<a-2&&nums[j]==nums[j+1])
j++;
}
while(i<a-3&&nums[i]==nums[i+1])
i++;
}
return b;
}
};
19. 删除链表的倒数第N个节点
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *a=head;
int b,k=0;
while(a)
{
a=a->next;
k++;
}
b=k-1-n;
if (b<0)
return head->next;
ListNode *c=head;
for(int i=0;i<b;i++)
{
c=c->next;
}
c->next= c->next->next;
return head;
}
};
20. 有效的括号
class Solution {
public:
bool isValid(string s) {
stack <int> stk;
int a = s.size();
char b;
stk.push(NULL);
for (int i=0; i<a; i++)
{
if ((s[i] == '(') || (s[i] == '{') || (s[i] == '['))
stk.push(s[i]);
else
{
if (stk.top() == NULL)
return false;
b = stk.top();
if (((b == '(') && (s[i] == ')')) || ((b == '{') && (s[i] == '}')) || ((b == '[') && (s[i] == ']')))
{
stk.pop();
}
else return false;
}
}
if (stk.top() == NULL)
return true;
else
return false;
}
};
21. 合并两个有序链表
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode temp_head(0); //设置临时头节点temp_head
ListNode *ptr = &temp_head; //使用pre指针指向temp_head
while(l1&&l2){ //l1和l2不空时,对它们进行比较
if(l1->val < l2->val){ //如果l1对应的节点小于l2对应的节点
ptr->next = l1; //将ptr与较小的节点进行连接
l1 = l1->next;
}
else{
ptr->next = l2;
l2 = l2->next;
}
ptr = ptr->next; //ptr指向新连接的节点
}
if(l1){ //如果l1有剩余
ptr->next = l1; //将l1接到ptr后
}
if(l2){
ptr->next = l2; //将l2接到ptr后
}
return temp_head.next;
}
};
23. 合并K个排序链表
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
if(lists.size()==0)
return NULL;
ListNode*p=lists[0];
for(int i=1;i<lists.size();i++)
{
p=mergeTwoLists(p, lists[i]);
}
return p;
}
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode temp_head(0); //设置临时头节点temp_head
ListNode *ptr = &temp_head; //使用pre指针指向temp_head
while(l1&&l2){ //l1和l2不空时,对它们进行比较
if(l1->val < l2->val){ //如果l1对应的节点小于l2对应的节点
ptr->next = l1; //将ptr与较小的节点进行连接
l1 = l1->next;
}
else{
ptr->next = l2;
l2 = l2->next;
}
ptr = ptr->next; //ptr指向新连接的节点
}
if(l1){ //如果l1有剩余
ptr->next = l1; //将l1接到ptr后
}
if(l2){
ptr->next = l2; //将l2接到ptr后
}
return temp_head.next;
}
};
24. 两两交换链表中的节点
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
if(head==NULL)
return head;
ListNode* p=head->next;
if(p&&p->next)
{
ListNode* k=p->next;
p->next=head;
head->next=swapPairs(k);
return p;
}
else if(p&&!p->next)
{
p->next=head;
head->next=NULL;
return p;
}
else return head;
}
};
25. k个一组翻转链表
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
ListNode*p=head,*q,*r;
int a=k;
while(a--)
{
if(!p) return head;
q=p;
p=p->next;
}
q->next=NULL;
r=reverse(head);
head->next=reverseKGroup(p,k);
return r;
}
ListNode* reverse(ListNode* head){
if(head==nullptr || head->next==nullptr) return head;
ListNode*p=head;
ListNode*q=p->next;
ListNode*r;
while(q){
r=q->next;
q->next=p;
p=q;
q=r;
}
head->next=NULL;
return p;
}
};
26. 删除排序数组中的重复项
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int a=nums.size();
int b=0;
if(a==0)
return 0;
for(int i=1;i<a;i++)
{
if (nums[i]!=nums[b])
nums[++b]=nums[i];
}
return ++b;
}
};
27. 移除元素
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int a=nums.size();
int b=0;
if(a==0)
return 0;
for(int i=0;i<a;i++)
{
if (nums[i]!=val)
nums[b++]=nums[i];
}
return b;
}
};
28. 实现strStr()
class Solution {
public:
int strStr(string haystack, string needle) {
int a=haystack.size();
int b=needle.size();
if(b==0)
return 0;
int k;
int j;
for(int i=0;i<a;i++)
{
if(haystack[i]==needle[0])
{
k=i;
for(j=0;j<b;j++)
{
if(haystack[k++]!=needle[j])
break;
}
if(j==b)
return i;
}
}
return -1;
}
};
31. 下一个排列
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int k=-1,p;
for(int i=nums.size()-1;i>0;i--)
{
if(nums[i]>nums[i-1])
{
k=i-1;
break;
}
}
if(k<0)
reverse(nums.begin(), nums.end());
else{
for(int i=nums.size()-1;i>0;i--)
{
if(nums[i]>nums[k])
{
p=i;
break;
}
}
swap(nums[p],nums[k]);
reverse(nums.begin()+k+1, nums.end());
}
}
};
35. 搜索插入位置
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int high=nums.size();
int mid,low=0;
while(low<high)
{
mid=(low+high)/2;
if(nums[mid]<target)
low=mid+1;
else if(nums[mid]>target)
high=mid;
else return mid;
}
if(nums[mid]>target)
return mid;
else return ++mid;
}
};
46. 全排列
class Solution {
public:
void perm(vector<int> num,int k,int n, vector<vector<int> > &res){
if (k==n){
res.push_back(num);
}else{
for (int i=k;i<=n;i++){
int tmp = num[k];
num[k]=num[i];
num[i]=tmp;
perm(num,k+1,n,res);
tmp = num[k];
num[k]=num[i];
num[i]=tmp;
}
}
}
vector<vector<int> > permute(vector<int> &num) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
vector<vector<int> > res;
perm(num,0,(num.size()-1),res);
return res;
}
};
47. 全排列 II
class Solution {
public:
void perm(vector<int> num,int k,int n, vector<vector<int> > &res){
if (k==n){
res.push_back(num);
}else{
for (int i=k;i<=n;i++){
int tmp = num[k];
num[k]=num[i];
num[i]=tmp;
perm(num,k+1,n,res);
tmp = num[k];
num[k]=num[i];
num[i]=tmp;
}
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
vector<vector<int> > res;
perm(nums,0,(nums.size()-1),res);
sort(res.begin(),res.end());
res.erase(unique(res.begin(),res.end()),res.end());
return res;
}
};
48. 旋转图像
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n=matrix.size();
for(int i=0; i<n/2; ++i){
for(int j=0; j<n; ++j){
swap(matrix[i][j], matrix[n-1-i][j]);
}
}
for(int i=0; i<n; ++i){
for(int j=0; j<i; ++j){
swap(matrix[i][j], matrix[j][i]);
}
}
}
};
49. 字母异位词分组
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<string> k=strs;
vector<vector<string>> c;
for(int i=0;i<strs.size();i++)
{
sort(k[i].begin(),k[i].end());
}
vector<string> p=k;
sort(k.begin(),k.end());
k.erase(unique(k.begin(),k.end()),k.end());
for(int j=0;j<k.size();j++)
{
vector<string> b;
for(int i=0;i<strs.size();i++)
{
if(p[i]==k[j])
b.push_back(strs[i]);
}
c.push_back(b);
}
return c;
}
};
50. Pow(x, n)
class Solution {
public:
double myPow(double x, int n) {
if(x==0.0)
return x;
if(n==0||x==1.0)
return 1;
if(n<0)
{
x=1/x;
if(n<=-2147483647)
n=-2147483646;
n=-n;
}
return pow(x,n);
}
double pow(double x, int n)
{
if (n==1)
return x;
double a=1;
if(n%2==1)
{
n--;
a=pow(x,n/2);
a=a*a*x;
}
else
{
a=pow(x,n/2);
a*=a;
}
return a;
}
};