【力扣刷题1-10】

  • 力扣刷题1-10

1、两数之和

1.1 题目

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案

1.2 分析

C++中map,有三种类型:

std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底层实现是红黑树。

同理,std::map 和std::multimap 的key也是有序的(这个问题也经常作为面试题,考察对语言容器底层的理解)。更多哈希表的理论知识请看关于哈希表,你该了解这些!

这道题目中并不需要key有序,选择std::unordered_map 效率更高!使用其他语言的录友注意了解一下自己所用语言的map结构的内容实现原理。

接下来需要明确两点:

map用来做什么
map中key和value分别表示什么
map目的用来存放我们访问过的元素,因为遍历数组的时候,需要记录我们之前遍历过哪些元素和对应的下表,这样才能找到与当前元素相匹配的(也就是相加等于target)

接下来是map中key和value分别表示什么。

这道题 我们需要 给出一个元素,判断这个元素是否出现过,如果出现过,返回这个元素的下标。

那么判断元素是否出现,这个元素就要作为key,所以数组中的元素作为key,有key对应的就是value,value用来存下标。

所以 map中的存储结构为 {key:数据元素,value:数组元素对应的下表}。

在遍历数组的时候,只需要向map去查询是否有和目前遍历元素比配的数值,如果有,就找到的匹配对,如果没有,就把目前遍历的元素放进map中,因为map存放的就是我们访问过的元素。
在这里插入图片描述

1.3 代码实现

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        std::unordered_map<int,int> hashmap;
        for(int i=0;i<nums.size();i++){
            auto iter=hashmap.find(target-nums[i]);
            if(iter==hashmap.end()){
                //没有找到,插入
                hashmap.insert({nums[i],i});
            }else{
                return {iter->second,i};
            }
            

        }
        return {};
        
    }
};

2、两数相加

2.1 题目

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

2.2 分析

2.3 代码实现

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode *head=nullptr,*tail=nullptr;
        int carry=0;
        while(l1 || l2){//链表未扫描结束
            int n1=l1 ? l1->val:0;
            int n2=l2 ? l2->val:0;
            int sum=(n1+n2+carry)%10;
             carry=(n1+n2+carry)/10;
            if(!head)//第一个值插入
                head=tail= new ListNode (sum);
            else{//剩下的值插入
                tail->next=new ListNode(sum);
                tail=tail->next;
            }
            if(l1)
                l1=l1->next;
            if(l2)
                l2=l2->next;
        }
        if(carry>0)//最后有进位要附加一个节点
           tail->next= new ListNode(carry);

        return head;

        

    }
};

3、无重复字符的最长子串

3.1 题目

3.2 分析


3.3 代码实现

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        unordered_set<char> occ;
        int rk=-1;//右指针初始为字符串左边界的左侧
        int ans=0;
        for(int i=0;i<s.size();i++){
            if(i){
                occ.erase(s[i-1]);//左指针移动,则删除前面一个字符
            }
            while(rk+1<s.size() && occ.find(s[rk+1])==occ.end()){
                //还没遍历完且当前指向字符不在子串中
                occ.insert(s[rk+1]);
                ++rk;
            }
            ans=max(ans,rk+1-i);
        }
        return ans;

    }
};

4、寻找两个有序数组的中位数

4.1 题目

4.2 分析

由于两个数组的长度已知,因此中位数对应的两个数组的下标之和也是已知的。维护两个指针,初始时分别指向两个数组的下标 000 的位置,每次将指向较小值的指针后移一位(如果一个指针已经到达数组末尾,则只需要移动另一个数组的指针),直到到达中位数的位置。

4.3 代码实现

class Solution {
public:
    int findKthElememt(const vector<int>& nums1, const vector<int>& nums2,int k){
        int m=nums1.size(),n=nums2.size();
        int index1=0,index2=0;
        while (true){
            if(index1==m)//nums1的数全部排除
                return nums2[index2+k-1];
            if(index2==n)//nums2的数全部排除
                return nums1[index1+k-1];
            if(k==1)
                return min(nums1[index1],nums2[index2]);
            int newindex1=min(index1+k/2-1,m-1);
            int newindex2=min(index2+k/2-1,n-1);
            int pri1=nums1[newindex1];
            int pri2=nums2[newindex2];
            if(pri1>=pri2){
                k-=newindex2-index2+1;//排除比较之后更小值所在数组的[index,newindex]范围的数
                index2=newindex2+1;
            }else{
                k-=newindex1-index1+1;
                index1=newindex1+1;
            }
        }
    }
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int m=nums1.size(),n=nums2.size();
        if((m+n)%2)
            return findKthElememt(nums1, nums2,(m+n)/2+1);//总长为奇数
        else
            return (findKthElememt(nums1, nums2,(m+n)/2)+findKthElememt(nums1, nums2,(m+n)/2+1))/2.0;

    }
};

5、最长回文子串

5.1 题目

5.2 分析

5.3 代码实现

class Solution {
public:
    int expandAroundCenter(string s,int left,int right){
        while(left>=0 && right<s.size() && s[left]==s[right])
        {
            left--;
            right++;//向外扩展
        }
        return right-left-1;
    }
    string longestPalindrome(string s) {
        if(s.size()<1)
            return "";
        if(s.size()==1)
            return s;
        int n=s.size();
        int maxlen=0;
        int left,right;
        for(int i=0;i<n;i++){
            int len1=expandAroundCenter(s,i,i);
            int len2=expandAroundCenter(s,i,i+1);
            int len=max(len1,len2);
            if(len>maxlen){
                maxlen=len;
                left=i-(len-1)/2;
                right=i+len/2;
            }

        }
        return s.substr(left,maxlen);

    }
};


6、Z 字形变换

6.1 题目

6.2 分析

6.3 代码实现

7、整数反转

7.1 题目

7.2 分析

7.3 代码实现

8、字符串转换整数 (atoi)

8.1 题目

8.2 分析

8.3 代码实现

9、回文数

9.1 题目

9.2 分析

9.3 代码实现

10、正则表达式匹配

10.1 题目

10.2 分析

10.3 代码实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,关于力扣刷题C++常用操作,我可以给你一些常见的操作和技巧: 1. 使用 STL 容器和算法库:STL(Standard Template Library)是 C++ 标准库中的一个重要组成部分,包含了许多常用的容器和算法。在力扣刷题中,使用 STL 可以大大提高代码的效率和可读性。例如,vector 可以用来存储动态数组,sort 可以用来排序等等。 2. 使用 auto 关键字:auto 关键字可以自动推导变量类型,可以减少代码量和提高可读性。例如,auto x = 1; 可以自动推导出 x 的类型为 int。 3. 使用 lambda 表达式:lambda 表达式是 C++11 中引入的一种匿名函数,可以方便地定义一些简单的函数对象。在力扣刷题中,使用 lambda 表达式可以简化代码,例如在 sort 函数中自定义比较函数。 4. 使用位运算:位运算是一种高效的运算方式,在力扣刷题中经常会用到。例如,左移运算符 << 可以用来计算 2 的幂次方,右移运算符 >> 可以用来除以 2 等等。 5. 使用递归:递归是一种常见的算法思想,在力扣刷题中也经常会用到。例如,二叉树的遍历、链表的反转等等。 6. 使用 STL 中的 priority_queue:priority_queue 是 STL 中的一个容器,可以用来实现堆。在力扣刷题中,使用 priority_queue 可以方便地实现一些需要维护最大值或最小值的算法。 7. 使用 STL 中的 unordered_map:unordered_map 是 STL 中的一个容器,可以用来实现哈希表。在力扣刷题中,使用 unordered_map 可以方便地实现一些需要快速查找和插入的算法。 8. 使用 STL 中的 string:string 是 STL 中的一个容器,可以用来存储字符串。在力扣刷题中,使用 string 可以方便地处理字符串相关的问题。 9. 注意边界条件:在力扣刷题中,边界条件往往是解决问题的关键。需要仔细分析题目,考虑各种边界情况,避免出现错误。 10. 注意时间复杂度:在力扣刷题中,时间复杂度往往是评判代码优劣的重要指标。需要仔细分析算法的时间复杂度,并尽可能优化代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值