LeetCode的medium题集合(C++实现)一

1.Two Sum
Given an array of integers, find two numbers such that they add up to a specific target number.You may assume that each input would have exactly one solution.
For example:Input: numbers=2,7,11,15,target=9
Output: index1=1,index2=2 . 返回序号在原值上加1,防止为0.
分析:让数组的两的元素之和等于另一个数,可以先将数组排序,利用头尾两指针进行比较,这样时间复杂度为排序的 nlogn ,这里要输出两个元素的索引号,可以将索引号和值构成键值对,并按值大小进行排序。

vector<int> twoSum(vector<int> &numbers, int target) {
        vector<int> result;
        vector<pair<int,int> > mid;
        mid.reserve(numbers.size());
        vector<pair<int,int> >::iterator pos;
        vector<pair<int,int> >::iterator end;
        for(int i=0;i<numbers.size();i++)
        {
            mid.push_back(pair<int,int>(i+1,numbers[i]));
        }

        sort(mid.begin(),mid.end(),[&](const pair<int,int> &x, const pair<int,int> &y) -> bool 
        {  
           return x.second <y.second;  
        });
        for(pos=mid.begin(),end=mid.end()-1;pos!=end;)
        {
            if((pos->second+end->second)==target)
            {
               return vector<int>(  
            {min(pos->first, end->first),  
             max(pos->first, end->first)}); 
            }
            else
            {
                if((pos->second+end->second)>target)
                {
                    --end;
                }
                 else
                 {
                     ++pos;
                 }
            }
        }
    }

2.Add Two Numbers
You are given two linked lists representing two non-negative numbers. Add the two numbers and return it as a linked list.

ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {
        ListNode* mid=new ListNode(0);
        ListNode* tail=mid;
        int check=0,sum=0;
        while(l1!=NULL||l2!=NULL||check!=0)
        {
            int num1=l1==NULL?0:l1->val;
            int num2=l2==NULL?0:l2->val;
            sum=num1+num2+check;
            check=sum/10;
            sum=sum%10;
            tail->next=new ListNode(sum);
            tail=tail->next;
            if(l1!= NULL)l1=l1->next;
            if(l2!= NULL)l2=l2->next;
        }
        return mid->next;
    }

3.Longest Substring Without Repeating Characters
Given a string, find the length of the longest substring without repeating characters.For example, the longest substring without repeating letters for “abcabcbb” is “abc”, the length is 3.
分析:将字符串中的字符逐个插入vector容器中,当遇到相同的字符时,将容器中的该字符及它以前的字符删除,用一个变量记录容器中存在过的最大值。

int lengthOfLongestSubstring(string s) {
        vector<char> sub;
        if(s.size()==0)
        return 0;
        sub.reserve(s.size());
        vector<char>::iterator result;
        int max=0;

        sub.push_back(s[0]);
        for(int i=1;i<s.size();i++)
        {
            result=find(sub.begin(),sub.end(),s[i]);
            if(result==sub.end())
            {
                sub.push_back(s[i]);
            }
            else
            {
               max=(max<sub.size())?sub.size():max;
               if (result == sub.begin())
               {
                sub.erase(result);
               }
            else{ sub.erase(sub.begin(), result+1); }
               sub.push_back(s[i]);
            }
        }
        max=(max<sub.size())?sub.size():max;
        return max;
    }

4.Longest Palindromic Substring
Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.
这是一个动态规划问题,用一个二维bool数组dp[i][j]来记录从s[i]到s[j]组成的子串是否为回文。当 s[i]==s[j] 时, dp[i][j]=dp[i+1][j1] ,否则 dp[i][j]=false .

string longestPalindrome(string s) {
    int len = s.length(), maxbegin = 0, maxlen = 1;
    vector<vector<bool> > dp(len, vector<bool>(len));;
    for (int i = 0; i<len; i++)
        dp[i][i] = true;   //单个字符是回文
    for (int i = 0; i<len - 1; i++)
    {
        if (s[i] == s[i + 1])
        {
            dp[i][i + 1] = true;
            maxbegin = i;
            maxlen = 2;
        }
    }
    for (int i = len - 3; i >= 0; i--)
    {
        for (int j = i + 2; j<len; j++)
        {
            if (s[i] == s[j] && dp[i + 1][j - 1])
            {
                dp[i][j] = true;
                maxbegin = i;
                maxlen = j - i + 1;
            }
        }
    }
    return s.substr(maxbegin, maxlen);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值