leetcode代码解析1,2,3

1.题目:给定一个数组,返回数组中的两个数,使两数和为一个给定值(假设只有一种结果)

例:
given nums=[2,7,11,15] , target = 9
Because nums[0]+nums[1]=9,
return [0,1]

方法:两数相加可以有三种情况,大于小于或等于target,所以可以对数组进行排序sort,之后用最左边的数加上最右边的数,结果偏大则取倒数第二位替换最右的数,偏小则取第二位替换最左的数,直到得到相等的数。

代码:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> indices;
        int lenOfVectors = nums.size();
        bool found=false;
        vector< pair<int, int> > new_nums;
        for(int i=0; i<lenOfVectors; ++i){
            new_nums.push_back(make_pair(nums[i], i));
        }//记录每个数在数组中的位置
        sort(new_nums.begin(), new_nums.end());
        int j=0, k=lenOfVectors-1;
        while(j<k){
            if(new_nums[j].first+new_nums[k].first==target){
                indices.push_back(new_nums[j].second);
                indices.push_back(new_nums[k].second);
                break;
            }
            else if(new_nums[j].first+new_nums[k].first<target){
                j++;
            }
            else{
                k--;
            }
        }
        return indices;
    }
};

2.题目:将连个用链表表示的数相加,数的每一位分别用链表的节点表示,其中个位是头节点,其后的节点分别表示十位千位以及以上,结果同样用链表来表示。

例:
input:(2 -> 4 -> 3)+(5 -> 6 ->4)
Output:7 ->0 ->8
Explanation:342+465=807

方法:
没什么可讲的,主要注意进位,如果最后产生进位,需要再生成一个节点。

代码:

/**
 * 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* head = new ListNode(0);
        ListNode* curr = head;
        int cbit = 0;//进位
        int a = 0;
        int b = 0;
        while(l1||l2)
        {
            int sum = ((l1)?(l1->val):(0)) + ((l2)?(l2->val):(0)) + cbit;
            curr->next = new ListNode(sum%10);
            cbit = sum/10;
            if(l1) l1 = l1->next;
            if(l2) l2 = l2->next;
            curr = curr->next;
        }
        if (cbit)  
        {
            curr->next = new ListNode(cbit);    
        }
        return head->next;
    }
};

3.题目:给定一个string找出最长的不带重复的string,返回他的长度

例:
input:“abcabcbb”
output:3
Explanation:“abc”

input:“pwwkew”
output:3
Explanation:“wke”

方法:用一个数组表示每种类型的字符在字符串中出现的最后的位置,所求子串长度等于该字符最新出现的位置减去之前最后出现的位置,然后新的位置成为最后出现的位置。

class Solution 
{
public:
    int lengthOfLongestSubstring(string s) 
    {
        int flags[256];
        for (int i = 0; i < 256; i++)
            flags[i] = -1;
        
        int longest = 0;
        int i = 0;
        int collision = -1;
        while (s[i] != 0)
        {
            if (flags[s[i]] != -1)
                collision = (collision > flags[s[i]] ? collision : flags[s[i]]);
            flags[s[i]] = i;
            longest = (i - collision > longest ? i - collision : longest);
            i++;
        }
        
        return longest;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值