ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

力扣刷题日记

2021-10-25 21:33:48  阅读:155  来源: 互联网

标签:begin end target temp nums 力扣 vector 日记 刷题


力扣刷题日记

大概计划是easy->medium->hard,同时尽量按门类做题


题目列表

1. 两数之和

添加链接描述

N^2肯定是用不得的,一开始想排序后拿两个下标向中间逼近,结果类似[2,3,3]或[3,3,4]这样的直接错(因为排序后再确定数的下标是去原数组中按值查找)。然后就换了在数组中找target-nums[i]

#include <algorithm>
#include <vector>
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int len = nums.size();
        // vector<int> temp(nums);    
        // sort(nums.begin(),nums.end());
        // int i = 0, j = len-1;
        vector<int> ans;
        vector<int>::iterator it;
        for ( int i = 0, j = len; i < len; i++,j = len ){
            it = find( nums.begin(), nums.end(), target-nums[i]);
            if( it-nums.begin() == i ) {
                it = find( ++it, nums.end(), target-nums[i]);                         
            }
            if( it == nums.end() ) continue;        
            j = it - nums.begin();
            ans.push_back(i);
            ans.push_back(j);
            break;
        }
        // while( i < j ){
        //     while( nums[i] + nums[j] > target && i < j ) j--;
        //     if( nums[i] + nums[j] == target ) {
        //        vector<int>::iterator it = find(temp.begin(),temp.end(),nums[i]);
        //        i = it - temp.begin();    
        //        vector<int>::iterator it2;
        //        if( nums[i] == nums[j] )      
        //             it2 = find(++it, temp.end(), nums[j]);
        //         else
        //             it2 = find(temp.begin(),temp.end(),nums[j]);
        //        j = it2 - temp.begin();           
        //        ans.push_back(i);
        //        ans.push_back(j);
        //         break;
        //     }
        //     while( nums[i] + nums[j] < target && i < j ) i++;
        //     if( nums[i] + nums[j] == target ) {
        //        vector<int>::iterator it = find(temp.begin(),temp.end(),nums[i]);
        //        i = it - temp.begin();    
        //        vector<int>::iterator it2;
        //        if( nums[i] == nums[j] )      
        //             it2 = find(++it, temp.end(), nums[j]);
        //         else
        //             it2 = find(temp.begin(),temp.end(),nums[j]);
        //        j = it2 - temp.begin();           
        //        ans.push_back(i);
        //        ans.push_back(j);
        //         break;
        //     }
        // }
        return ans;
    }
};

范例

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
          unordered_map<int,int> h;

          for(int i=0;i<nums.size();i++){
              int res=target-nums[i];
              if(h.find(res)!=h.end()) 
                return {i,h[res]};
              else
                h[nums[i]]=i;
          }
          return {};
    }
};

要看哈希表

笔记

  1. 在vector中按值找下标
//方法一
vector<int>::iterator it = find(nums.begin(),nums.end(),value);
i = it - temp.begin();  
//方法二
auto i= distance(temp.begin(), iter);//distance()函数用于计算两个迭代器表示的范围内包含元素的个数

2.当我们使用遍历整个数组的方式寻找 target - x 时,需要注意到每一个位于 x 之前的元素都已经和 x 匹配过,因此不需要再进行匹配。而每一个元素不能被使用两次,所以我们只需要在 x 后面的元素中寻找 target - x。

标签:begin,end,target,temp,nums,力扣,vector,日记,刷题
来源: https://blog.csdn.net/weixin_45665700/article/details/120960197

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有