#盛最多水的容器#
思路:用双指针分别记录right和left然后依次向内推进
class Solution {
public:
int maxArea(vector<int>& height) {
int max=0;
int i=0,j=height.size()-1;
while(i<j){
if(height[i]<height[j]){
if(max< height[i]*(j-i))max= height[i]*(j-i);
i++;
}
else{
if(max< height[j]*(j-i))max= height[j]*(j-i);
j--;
}
}
return max;
}
};
#两数相加#
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* head;
ListNode* l;
head=l=new ListNode(0);
int n1,n2,carry=0;
while(l1 || l2){
n1=l1?l1->val:0;
n2=l2?l2->val:0;
ListNode* temp=new ListNode((n1+n2+carry)%10);
carry=(n1+n2+carry)/10;
l->next=temp;
l=l->next;
if(l1)l1=l1->next;
if(l2)l2=l2->next;
}
if(carry>0){//这一步很容易忽视,可能会多一位
l->next = new ListNode(carry);
}
return head->next;
}
};
#无重复字符的最长子串#
思路:不仅包括字母!!!用set记录了,时间复杂度和空间复杂度都有点高
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int maxSub=0,tempMax=0;
set<char> sign;
int start=0;
for(int i=0;i<s.size();i++){
if(sign.find(s[i])==sign.end() || s.size()==1){
sign.insert(s[i]);
tempMax++;
}
else{
i=s.find(s[i],start);
start=i+1;
sign.clear();
tempMax=0;
}
maxSub=max(maxSub,tempMax);
}
return maxSub;
}
};
#最长回文子串#
思路:暴力破解依次判断是否是回文。从最长依次递减,只要判断是回文串,则一定是最长回文子串。str.substr(pos,len)获取 str从pos开始,长度len的子串。(对于较长的字符串,时间太久了)
/*时间貌似太久了,提交显示超出时间限制*/
class Solution {
public:
bool isPalindrome(string s){
int left=0,right=s.size()-1;
while(left<right){
if(s[left]!=s[right])return false;
left++;
right--;
}
return true;
}
string longestPalindrome(string s) {
for(int i=s.size();i>0;i--){
for(int j=0;j+i<=s.size();j++){
if( isPalindrome(s.substr(j,i)) ){
return s.substr(j,i);
}
}
}
return "";
}
};