leetcode刷题第一日<两数和问题>

开始就用到了c++的哈希表是真的恶心,首先学习一波基础知识

https://blog.csdn.net/u010025211/article/details/46653519

下面放下大佬的代码

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
      vector<int>a;
        a.push_back(-1);
        for(int i=0;i<nums.size();i++)
        {
        for(int j=i+1;j<nums.size();j++)
           if(nums[i]+nums[j]==target)
           {
               a[0]=i;
               a[1]=j;
               return a;
           }
        }

    }
};

这里是完整版代码

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
      vector<int>a;
        a.push_back(-1);
        for(int i=0;i<nums.size();i++)
        {
        for(int j=i+1;j<nums.size();j++)
           if(nums[i]+nums[j]==target)
           {
               a[0]=i;
               a[1]=j;
               return a;
           }
        }

    }
};

void trimLeftTrailingSpaces(string &input) {
    input.erase(input.begin(), find_if(input.begin(), input.end(), [](int ch) {
        return !isspace(ch);
    }));
}

void trimRightTrailingSpaces(string &input) {
    input.erase(find_if(input.rbegin(), input.rend(), [](int ch) {
        return !isspace(ch);
    }).base(), input.end());
}

vector<int> stringToIntegerVector(string input) {
    vector<int> output;
    trimLeftTrailingSpaces(input);
    trimRightTrailingSpaces(input);
    input = input.substr(1, input.length() - 2);
    stringstream ss;
    ss.str(input);
    string item;
    char delim = ‘,‘;
    while (getline(ss, item, delim)) {
        output.push_back(stoi(item));
    }
    return output;
}

int stringToInteger(string input) {
    return stoi(input);
}

string integerVectorToString(vector<int> list, int length = -1) {
    if (length == -1) {
        length = list.size();
    }

    if (length == 0) {
        return "[]";
    }

    string result;
    for(int index = 0; index < length; index++) {
        int number = list[index];
        result += to_string(number) + ", ";
    }
    return "[" + result.substr(0, result.length() - 2) + "]";
}

int main() {
    string line;
    while (getline(cin, line)) {
        vector<int> nums = stringToIntegerVector(line);
        getline(cin, line);
        int target = stringToInteger(line);

        vector<int> ret = Solution().twoSum(nums, target);

        string out = integerVectorToString(ret);
        cout << out << endl;
    }
    return 0;
}

这貌似有点高深但是算法复杂度是非常低的,貌似是4msj解决,我们再利用基础的c暴力解决下,

双重循环遍历,代码如下

int* twoSum(int* nums, int numsSize, int target) {
    int *a;
    a=(int *)malloc(2*sizeof(int));
    for(int i=0;i<numsSize-1;i++)
    {
        for(int j=i+1;j<numsSize;j++)
        {
            if((nums[i]+nums[j])==target)
             {
              a[0]=i;
              a[1]=j;
             }
        }
    }
    return a;

但是这个不是最优的,最优算法貌似是采用二分法 代码像这样

int* twoSum(int* nums, int numsSize, int target) {
    int *a;
    a=(int *)malloc(2*sizeof(int));
    int mid=numsSize/2;
    for(int i=0;i<mid;i++)
    {
        for(int j=mid;j<numsSize;j++)
        {
            if((nums[i]+nums[j])==target)
             {
              a[0]=i;
              a[1]=j;
             }
        }
    }
    return a;

最后在用python解决下吧

def twoSum(self, nums, target):
       hashmap={}
       for index, num in enumerate(nums):
            another_num = target - num
            if another_num in hashmap:
                return [hashmap[another_num], index]
            hashmap[num] = index
       return None

原文地址:https://www.cnblogs.com/kk328/p/10433487.html

时间: 2024-07-30 11:36:02

leetcode刷题第一日<两数和问题>的相关文章

#leetcode刷题之路29- 两数相除

给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符.返回被除数 dividend 除以除数 divisor 得到的商. 示例 1:输入: dividend = 10, divisor = 3输出: 3示例 2:输入: dividend = 7, divisor = -3输出: -2 int divide(int dividend, int divisor) { int count=0; if((dividend>INT32_MAX|

[LeetCode][Python]刷题记录 1. 两数之和

第一次做发现很多小细节以前都没注意过,感觉还是蛮头疼的. 题目: 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 根据题目要求[你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用.] 所以我们的思路就有了,只要每次循环只遍历后面的就可以啦,这样结果就不会重复惹. 上代码 class Solution: def twoSum(self, nums, target): """ :type nu

LeetCode刷题-009回文数

判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数 示例 1:输入: 121输出: true 示例 2:输入: -121输出: false解释: 从左向右读, 为 -121 . 从右向左读, 为 121- .因此它不是一个回文数. 示例 3:输入: 10输出: false解释: 从右向左读, 为 01 .因此它不是一个回文数. 进阶:不将整数转为字符串来解决这个问题 1 class Solution { 2 public: 3 bool isPalindrom

leetcode刷题四&lt;寻找两个有序数组的中位数&gt;

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 不会同时为空. 示例 1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0 示例 2: nums1 = [1, 2] nums2 = [3, 4] 则中位数是 (2 + 3)/2 = 2.5 思路简单直接撸代码吧 double findMedianSortedArrays(

leetcode刷题--两数之和(简单)

一.序言 第一次刷leetcode的题,之前从来没有刷题然后去面试的概念,直到临近秋招,或许是秋招结束的时候才有这个意识,原来面试是需要刷题的,面试问的问题都是千篇一律的,只要刷够了题就差不多了,当然你的基础也要扎实,毕竟在技术面的时候很容易露馅的. 所以奉劝各位还未毕业,在大三或大二的师弟师妹早点刷题,心里也有底气进入求职大军,毕竟大四开始刷题的话时间上有些太紧了,推荐刷题的话就是牛客和leetcode. 回归正题,这次记录的是leetcode刷的第一题--两数之和. 二.审题 审题真的很重要

Leetcode刷题录之Two Sum

题意大概是给出一个数列num,和一个目标数target,然后要找出数列中的两个数,使得这两个数之和等于目标数,输出这两个数的下标值(从1开始算). 一个比较暴力的方法是用一个二重循环直接遍历序列,在第一重循环中找到a,在第二重循环中找到b,使得a+b=target,这种做法的时间复杂度是O(n^2), 提交时提示超时. 改进方法,先对数列num复制一个副本,然后对副本进行排序.在一重循环中找到a,接着对这个有序的副本进行二分查找,找到b= target-a,二分查找的 时间复杂度是O(logn)

LeetCode刷题(一):Two Sum

今天开始在LeetCode刷题,第一题为"两数之和(Two Sum)",整体来讲这一题难度是比较低的,但还是在这个过程中遇到一些问题,以下主要记录出现的一些问题. 这个题目比较容易想到的方法便是穷举了,很暴力但也很直接,需要注意的一点便是向量库Vector,自己也是前一阵子开始学数据结构才知道有这个库(有的也称为容器),定义计算数组长度用的方法是size()而不是length(),官方解答给的是length(),不知道是不是没有注意到还是因为他用的代码是Java(本人不了解Java),

LeetCode刷题总结-链表

LeetCode刷题总结-链表 一.链表     链表分为单向链表.单向循环链表和双向链表,一下以单向链表为例实现单向链表的节点实现和单链表的基本操作. 单向链表 单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域.这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值. 表元素域elem用来存放具体的数据: 链接域next用来存放下一个节点的位置(python中的标识): 变量p指向链表的头节点(首节点)的位置,从p出发能找到表

LeetCode刷题总结之双指针法

Leetcode刷题总结 目前已经刷了50道题,从零开始刷题学到了很多精妙的解法和深刻的思想,因此想按方法对写过的题做一个总结 双指针法 双指针法有时也叫快慢指针,在数组里是用两个整型值代表下标,在链表里是两个指针,一般能实现O(n)的时间解决问题,两个指针的位置一般在第一个元素和第二个元素或者第一个元素和最后一个元素,快指针在前“探路”,当符合某种条件时慢指针向前挪 盛最多水的容器 这道题其实是求最大面积,最大面积取决于较小值.初始时两指针分别位于第一和最后一个元素处,那么明确指针应该向什么方