day02 | 代码随想录 训练营

目录

Day01

题目1

模板总结

练习

题目2

Day02

题目1 977. 有序数组的平方

题目2 209. 长度最小的子数组

题目3:59. 螺旋矩阵 II

Day03

题目1:移除元素

题目2:设计链表

题目3 反转链表

Day04

题目1 24. 两两交换链表中的节点

题目2  19. 删除链表的倒数第 N 个结点

面试题 02.07. 链表相交

142.环形链表

Day6 哈希表

242. 有效的字母异位词

349.两个数组的交集

202.快乐数

1.两数之和


Day01

题目1

704 二分查找

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1

class Solution {
    public int search(int[] nums, int target) {
        int low = 0;
        int high = nums.length - 1;
        while(low <= high)
        {
            int mid = low + ((high - low) >> 1);
            if(nums[mid] > target){
                high = mid - 1;
            }else if(nums[mid] < target){
                low = mid + 1;
            }else{
                return mid;
            }
        }
        return -1;
    }
};
class Solution {
public:
    int search(vector& nums, int target) 
    {
        int right=nums.size();
        int left=-1;//请注意此种情况我们需要查找的区间是(left,right);
        int mid= left + ((right - left) >> 1);//这样写是为了防止int型数据过大导致溢出
        while(left+1target)//证明答案只可能存在于区间(left,mid)中
                right=mid;//将要查找的区间改为(left,mid)
            else left=mid;//证明答案只可能存在于区间(mid,right)中,将要查找的区间改为(mid,right)      
            mid=(right-left)/2+left;
        }
        return -1;
    }
};

总结:C++中string的size与length的区别

在C++的string类中,有两种函数:length和size。他们的作用都是返回字符串的长度
那么,问题来了,他们两者有什么区别?
为了钻研,我们要先找到他们两者的源代码
让我们先找到length的源代码
首先,我们随便定义一个字符串,并调用length

#include 
#include 
using namespace std;
int main(){
	string s;
	s.length();
	return 0;
}

然后,重点来了!按住Ctrl,点击length,就会跳到C++的库文件(如果看不懂,就选中length,右键到实现)
我们就可以看到length的源代码

length() const _GLIBCXX_NOEXCEPT
{ return _M_rep()->_M_length; }

然后,按照同样的步骤找到size的源代码

size() const _GLIBCXX_NOEXCEPT
{ return _M_rep()->_M_length; }

可以看到两者的源代码一摸一样,所以这两者其实没有区别
但是为什么要搞两个呢?
其实string一开始只有length,这是C语言延续下来的习惯
而size则是在出现STL之后,为了兼容加入了和STL容器求长度的函数一个名字的size,这样就可以方便的使用于STL的算法
 

模板总结

用C++实现二分查找的算法:

模版三步走

1.设置判别函数check

2.根据check的结果来查看区间更新方式

3.查看区间更新方式来决定是否要+1

算法思路:

假设目标值在闭区间[l, r]中, 每次将区间长度缩小一半,当l = r时,我们就找到了目标值。

版本1

当我们将区间[l, r]划分成[l, mid]和[mid + 1, r]时,其更新操作是r = mid或者l = mid + 1;,计算mid时不需要加1。

int bsearch_1(int l, int r)
{
    while (l < r)
    {
        int mid = l + r >>

你可能感兴趣的:(算法,leetcode,数据结构,c++)