leetcode经典hot100:两数之和、反转链表、移动零

两数之和:

题目描述:给一个target要求在一个数组里找到和为target的两个数

这道题最省事的方法是用哈希表,时间复杂度较低

class Solution {

public:

    vector<int> twoSum(vector<int>& nums, int target) {           //vector容器相当于一个动态数组

         unordered_map<int,int>haxibiao;                                    //定义一个哈希表

         for(int i=0;i<nums.size();i++){

             auto it=haxibiao.find(target-nums[i]);                           //auto it自动迭代器,通过find方法                                                                                                         遍历数组

             if(it!=haxibiao.end()){

                 return{it->second,i};                                           //若能找到,返回两个数字的下表(值)

             }

             haxibiao[nums[i]]=i;                                                //数组元素作为键,下表作为值

         }

         return{};                                                                       //若找不到,返回空

    }

};

总结一下这道题,首先用哈希表是毫无疑问的,太方便而且时间复杂度低,刚开始我是想着先用一个for吧哈希表填满,后来看了解析发现查找和存入工作可以一起,相当于遍历了每个数字和它前面所有数的可能性,这个搞清楚之后剩下的就是一些方法了:

auto it是一个自动迭代器,用于遍历容器内的对象,it类似于指针,可用*获取值

find函数需要输入键,返回的是迭代器

it->first是键,it->second是值,这道题将元素作为键,下表作为值

移动零:

题目描述:给一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。必须在不复制数组的情况下原地对数组进行操作

拿题思路:不能复制数组,就只能改变原数组的值达到目的,很明显,遍历一遍数组碰到不是0的数字就往前堆就行

class Solution {

public:

    void moveZeroes(vector<int>& nums) {

       int n=nums.size(),m=0;

       for(int i=0;i<n;i++){

           if(nums[i]){

               nums[m]=nums[i];

               m++;

           }  

       }  

          for(int i=n+1-m;i<n;i++){

              nums[i]=0;

          }      

    }

};

这道题不难,也没啥可标注的

反转链表:

题目描述:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表

拿题思路:首先得非常了解链表这个数据结构,它在内存中不是连续的一块空间,连接起来每个节点的是其指针域,指针指向下一个节点的地址,最后一个节点的指针域指向空。那我们只需要吧它每个节点的指针域的指向方向反转一下就可以了。

class Solution {

public:

    ListNode* reverseList(ListNode* head) {                        //指针类型的函数,返回也需要一个指针

        ListNode* curr=head;                                               

        ListNode*prev=nullptr;

       while(curr){

        ListNode* next=curr->next;

        curr->next=prev;

        prev=curr;

        curr=next;

        }

        return prev;

    }

};

这道题需要深刻理解链表这种数据结构,理解之后问题不大

(大概就是这样,新手没经验做了三道简单题,有什么错误或者更好的方法希望大佬指正,吐槽一下,leetcode这个答题模式真的不方便,汗流浃背了)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值