Leetcode解题记录

Posted 钢印

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode解题记录相关的知识,希望对你有一定的参考价值。

1.两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
 
解:
 1 class Solution {
 2 public:
 3     vector<int> twoSum(vector<int>& nums, int target) {
 4         int start=0;
 5         int next=1;
 6         vector<int> results;
 7         while(start<nums.size()){
 8             if(nums.at(start)>target){
 9                 start++;
10             }
11             else{
12                 int submit=target-nums.at(start);
13                 while(next<(nums.size()-start)){
14                     if(nums.at(start+next)!=submit){
15                         next++;
16                     }
17                     else{
18                         results.push_back(start);
19                         results.push_back(start+next);
20                         return results;
21                     }
22                 }
23             }
24         }
25         return results;
26     }
27 };

在得到最后的结果前遇到两个编译错误:Reference to non-static member function be called和control may reach end of non-void function。

第一个检查一下调用的类的函数名有没有写正确,我把nums.size()写成nums.size。所以编译出错。

第二个是跟返回类型不匹配相关的。

 

代码提交之后只通过了一个测试案例,检查之后在23行新增 start++;再次提交通过23个案例!

输入: [-1,-2,-3,-4,-5]
-8
输出: []
预期: [2,4]
关键问题出在第8行的判据:nums.at(start)>target。对于负数来说总是为真,所以输出为空!
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> results;
        int start=0;
        while(start<nums.size()){
            for(int next=1;next<(nums.size()-start);next++){
                if(nums.at(start)+nums.at(start+next)==target){
                    results.push_back(start);
                    results.push_back(start+next);
                    return results;
                }
            }
            start++;
        }
        return results;
    }
};

结果的耗时太长!!!

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> results;
        map<int,int> mymap;
        for(int i=0;i<nums.size();i++){
            mymap[nums[i]]=i;
        }
        for(int i=0;i<nums.size();i++){
            int submit=target-nums.at(i);
            if(mymap.count(submit)&&mymap[submit]!=i){
                results.push_back(i);
                results.push_back(mymap[submit]);
                return results;
            }
        }
        return results;
    }
};

使用map类之后:

2.搜索插入位置。

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

本题带给我的思考——一般二分查找是直接找目标值,而本题需要返回边界的索引值!!!

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int size = nums.size();
        if (size == 0) {
            return 0;
        }
        if (nums[size - 1] < target) {
            return size;
        }
        int left = 0;
        int right = size - 1;
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] < target) 
                left = mid + 1;
            else
                right = mid;
        }
        return left;
    }
};

 3.删除链表的倒数第N个节点

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        int length=0;
        ListNode* temp=head;
        ListNode* res=head;
        while(head!=NULL){
            length++;
            head=head->next;
        }
        if(length==n)
            return res->next;
        while(length-n-1>0){
            temp=temp->next;
            length--;
        }
        temp->next=temp->next->next;
        return res;
    }
};

 

 4.两两交换链表中的节点

/**
 * 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||head->next==NULL)
            return head;
        ListNode* temp=head;
        int v;
        while(temp!=NULL&&temp->next!=NULL){
            v=temp->val;
            temp->val=temp->next->val;
            temp->next->val=v;
            temp=temp->next->next;
        }
        return head;
    }
};

 5.在排序数组中查找元素的第一个和最后一个位置

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        int left=0;
        int right=nums.size()-1;
        int start,end;
        vector<int> res;
        if(nums.size()==0){
            res={-1,-1};
            return res;
        }
        if(nums.size()==1){
            if(target==nums[0])
                res={0,0};
            else
                res={-1,-1};
            return res;
        }
        while(left<right){
            int mid=left+(right-left)/2;
            if(nums[mid]<target)
                left=mid+1;
            else
                right=mid;//这里一定是right=mid,不然区间判定会出错!!!!
        }
        start=end=left;
        if(nums[start]!=target){
            res={-1,-1};
            return res;
        }
        int i=start;
        while(i<nums.size()&&nums[i]==target){
            end=i;
            i++;
        }
        res.push_back(start);
        res.push_back(end);
        return res;
    }
};

 

以上是关于Leetcode解题记录的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode笔记:Weekly Contest 246 比赛记录

LeetCode笔记:Weekly Contest 243 比赛记录

LeetCode笔记:Weekly Contest 240 比赛记录

LeetCode笔记:Weekly Contest 241 比赛记录

LeetCode笔记:Weekly Contest 242 比赛记录

LeetCode笔记:Weekly Contest 238 比赛记录