Leetcode 11-20
11. 盛最多水的容器 (思维)

思路很难 如果容器右侧比左侧低,那么移动左侧的木板,结果不会更好,所以应该移动右侧 反之亦然
int maxArea(vector<int>& height) {
int l=0,r=height.size()-1;
int res=-1;
while(l<r)
{
res=max(res,(r-l)*min(height[l],height[r]));
if(height[l]>height[r])r--;
else l++;
}
return res;
}
12 整数转罗马数字 (模拟)
提高一次AC成功率 细心
string intToRoman(int num) {
string res;
while(num>=1000)num-=1000,res+='M';
if(num>=900)num-=900,res+="CM";
if(num>=500)num-=500,res+="D";
if(num>=400)num-=400,res+="CD";
while(num>=100)num-=100,res+="C";
if(num>=90)num-=90,res+="XC";
if(num>=50)num-=50,res+="L";
if(num>=40)num-=40,res+="XL";
while(num>=10)num-=10,res+="X";
if(num>=9)num-=9,res+="IX";
if(num>=5)num-=5,res+="V";
if(num>=4)num-=4,res+="IV";
while(num>=1)num--,res+="I";
return res;
}
13 上一道题意的reverse (模拟)
int romanToInt(string s) {
int n=s.size();
int res=0;
for(int i=n-1;i>=0;i--){
if(s[i]=='I')res++;
if(s[i]=='V'){
res+=5;
if(i&&s[i-1]=='I'){
i--;
res--;
}
}
if(s[i]=='X'){
res+=10;
if(i&&s[i-1]=='I'){
i--;
res--;
}
}
if(s[i]=='L'){
res+=50;
if(i&&s[i-1]=='X'){
i--;
res-=10;
}
}
if(s[i]=='C'){
res+=100;
if(i&&s[i-1]=='X'){
i--;
res-=10;
}
}
if(s[i]=='D'){
res+=500;
if(i&&s[i-1]=='C'){
i--;
res-=100;
}
}
if(s[i]=='M'){
res+=1000;
if(i&&s[i-1]=='C'){
i--;
res-=100;
}
}
}
return res;
}
14. 最长公共前缀 (模拟)
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入:strs = ["flower","flow","flight"]
输出:"fl"
拿其它字符串跟第一个比就可以了
s.substr(i,l)表示从下标i开始 长度为l的字符串
string longestCommonPrefix(vector<string>& strs) {
string s=strs[0];
for(int i=1;i<strs.size();i++)
{
for(int j=0;j<s.size();j++)
{
if(s[j]!=strs[i][j])s=s.substr(0,j);
}
}
return s;
}
15. 三数之和 (双指针)
vector<vector<int>> threeSum(vector<int>& nums) {
vector <vector<int>>res;//二维数组 每行用三个空
int n=nums.size();
sort(nums.begin(),nums.end());
for(int i=0;i<n;i++)
{
if(i&&nums[i]==nums[i-1])continue;//判重 先判断第一个条件 必须放前面
for(int j=i+1,k=n-1;j<k;j++)//k放这里 O(n方)
{
if(j>i+1&&nums[j]==nums[j-1])continue;
while(nums[i]+nums[j]+nums[k]>0&&k>j+1)k--;
if(nums[i]+nums[j]+nums[k]==0)res.push_back({nums[i],nums[j],nums[k]});
}
}
return res;
}
16
int threeSumClosest(vector<int>& nums, int target) {
int res=1e5,delta=1e5;
int n=nums.size();
sort(nums.begin(),nums.end());
for(int i=0;i<n;i++)
{
for(int j=i+1,k=n-1;j<k;j++)
{
while(nums[i]+nums[j]+nums[k]>=target&&k>j+1)k--;//这里是等于 因为 停下来的右边
//一定 大于等于 target
int sum=nums[i]+nums[j]+nums[k];
if(abs(target-sum)<delta)
{
delta=abs(target-sum);
res=sum;
}
//大于等于target(下面的if) 和小于都比一下
if(k!=n-1&&abs(target-(sum-nums[k]+nums[k+1]))<delta)
{
delta=abs(target-(sum-nums[k]+nums[k+1]));
res=sum-nums[k]+nums[k+1];
}
}
}
return res;
}
18. 四数之和 (同15题)
vector<vector<int>> fourSum(vector<int>& a, int target) {
vector<vector<int> >b;
sort(a.begin(),a.end());
int n=a.size();
for(int i=0;i<n;i++)
{
if(i&&a[i]==a[i-1])continue;//防止重复
for(int j=i+1;j<n;j++)
{
if(j>i+1&&a[j]==a[j-1])continue;
for(int k=j+1,u=n-1;k<u;k++) //n三方
{
if(k>j+1&&a[k]==a[k-1])continue;
while(u>k+1&&a[i]+a[j]>target-(a[k]+a[u]))u--;
if(a[i]+a[j]==target-(a[k]+a[u]))b.push_back({a[i],a[j],a[k],a[u]});
}
}
}
return b;
}

浙公网安备 33010602011771号