LeetCode算法之路

这篇博客记录了作者在LeetCode上解决算法题目的过程,包括两数之和、合并两个有序链表、反转链表、替换空格以及在排序数组中查找数字等题目。作者分享了解题思路和关键点,例如使用unordered_map优化两数之和的搜索,合并两个有序链表时创建新链表的技巧,以及二分查找在查找数字问题中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自己记录一下吧

1、两数之和

https://leetcode.cn/problems/two-sum/
两层for循环暴力搜索会有很多重复操作,如:target = 10, nums = [1,8,3,2]
当 i = 1 时,j会依次搜索8、3、2,然后返回,继续搜索 i = 8 时,j依次搜索3、2
可以看到,当 i = 1 时,已经搜索到了nums中存在2,而当 i = 8 时,还需要从头搜索nums中是否存在2,因此,可以建立一个unordered_map用来存储之前已经被搜索到的元素,以元素作为key值,元素的下标位置作为value值。
2022年6月17日 14:50

21、合并两个有序链表

https://leetcode.cn/problems/merge-two-sorted-lists/
Point:
链表数据结构: 当前值:p->val;下一节点:p->next;链表后移:p = p->next
新建链表:ListNode* preHead = new ListNode(-1); preHead表示链表的头,此外还需一个指针ListNode* prev = preHead;用来遍历该链表,否则最后返回结果的时候会丢失头的位置(本质是一个指针)。
迭代解法:
新建一个链表,比较当前p1->val 和 p2->val的大小,不断连接到新链表上
2022年6月17日 15:56

剑指24、反转链表

https://leetcode.cn/problems/fan-zhuan-lian-biao-lcof/
解法一:双指针迭代在这里插入图片描述
定义两个前后指针,不断的将两指针局部的连接关系反转

ListNode* reverseList(ListNode* head) {
        if(head==nullptr || head->next ==nullptr) return head;
        ListNode* pre = head;
        ListNode* cur = nullptr;
        while(pre!=nullptr)
        {
        	//必须首先将pre->next的位置保存下来,否则当进行局部反转时,pre->next关系会丢失
            ListNode* temp = pre->next; 
            pre->next = cur;//连接关系局部反转
            cur = pre;//双指针后移
            pre = temp;
        }
        return cur;
    }

2022年6月18日 20:38

剑指05、替换空格

https://leetcode.cn/problems/ti-huan-kong-ge-lcof/
Point: string的长度是固定的,若想用三个char类型的‘%’,‘2’,‘0’代替‘ ’,需要对string进行扩容

string s1,s2;
s1.size()//获取字符串长度
s1 + s2;//可将两个字符串拼接在一起
s1.resize();
s1[]//可通过下标访问 
s1.substr(int pos = 0,int n ) //返回pos开始的n个字符组成的字符串

2022年6月19日 18:17

剑指53、在排序数组中查找数字

https://leetcode.cn/problems/zai-pai-xu-shu-zu-zhong-cha-zhao-shu-zi-lcof/
Point: 二分查找
方法一:通过二分查找后确定任意target的下标,随后左移+右移确定长度—>最坏为O(n)
方法二:通过两次二分查找:寻找左边界+右边界

//寻找左边界二分查找:当nums[mid] == t时,判断mid左边是否可以继续左移
int leftBinary(vector<int>& nums, int t)
    {
        int left = 0;
        int right = nums.size()-1;
        while(left <= right)
        {
            int mid = (left + right)/2;
            if(nums[mid] == t)
            {
            	//如果找到,判断一下是否为最左边界
               if(mid-1<0 || nums[mid-1] != t)
               return mid;
               else right =mid-1;
            }
            else if(nums[mid]<t)
            {
                left = mid+1;
            }
            else{
                right = mid-1;
            }
        }
        return -1;
    }

2022年6月21日 18:40

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值