day 1 LeetCode刷题日志

发布时间 2024-01-11 00:27:57作者: AcherLoveCode

今天的内容是 704 和 27 ovo

704. 二分查找

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target

写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1

Myself C:

//左闭右闭 [0,1,2,3]
int search(int* nums, int numsSize, int target) {
    int left = 0,right = numsSize - 1;
    while(left <= right) //wrong 1 : 因为是左闭右闭 故这里必须是 <= 
    {
        int mid = (left + right) / 2;
        if(target == nums[mid]) return mid;
        if(target > nums[mid])
            left = mid + 1;
        else
            right = mid - 1;    
    }
    return -1;
}

Myself C++:

//左闭右闭 [0,1,2,3]
int search(vector<int>& nums, int target)
{
    int left = 0,right = nums.size() - 1;
    while(left <= right)
    {
        int mid = left + (right - left) / 2; //防止溢出
        if(target == nums[mid]) return mid;
        if(target < nums[mid]) right = mid - 1;
        else left = mid + 1;
    }   
    return -1;
}

Carl C++:

//左闭右开 [0,1,2,3)
int search(vector<int>& nums, int target)
{
    //left是查找列表的第一个 right是查找列表最后一个的下一个
    int left = 0 , right = nums.size();
    while(left < right)
    {
        int mid = (left + right) / 2;
        if(target == nums[mid]) return mid;
        if(target > nums[mid]) left = mid + 1;
        else right = mid;
    }
    return -1;
}

Myself Sum:

  1. NOTICE 左闭右闭 左闭右开

  2. C语言的int类型最大是10^9

  3. C++的vector

    C语言可以用int arr[]定义数组 , 缺点是定长数组

    C++里面有动态数组vector,可以理解为不定长数组,在C++中叫做容器

    vector定义后能将所有的值初始化为0!

    ![cf3253d2365d246c1dc0108d6e004cc](C:\Users\Acher\OneDrive\文档\WeChat Files\wxid_l65lhnaxfysh22\FileStorage\Temp\cf3253d2365d246c1dc0108d6e004cc.jpg)

    #include<iostream>
    #include<vector>//使用vector 需要引入头文件
    using namespace std;
    
    int main()
    {
        vector<int> v;//定义一个 vector v 初始不定义大小
        cout << v.size();//未配大小,此时为 0
        v.resize(8);//将长度resize为 8
    
        vector<int> v1(10);//定义一个vector v1 长度为 10 
    
        vector<int> v3(100,9);//将长度为100的数组中所有值初始化为9
    
        //使用迭代器访问 vector
        //c.begin()是一个指针,指向容器的第一个元素
        //c.end()也是一个指针,指向容器的最后一个元素的后一个位置
        for(auto it = v.begin(); it != v.end(); it++)
        {
            cout << *it << " ";
        }
        return 0;
    }
    

27. 移除元素

给你一个数组 nums 和一个值 val

你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素

Myself C++:

//呃...我的双循环没写出来..数组不是越界了就是时间超时了
//然后我就想用这个暴力覆盖...听了Carl讲解原来这个是快慢指针...
//虽然我感觉挺暴力的...但是好吧...叫快慢指针确实更有说服力一些
//思路:循环找到不是val的值去从头覆盖数组 最后resize数组
// 时间复杂度:O(n)
// 空间复杂度:O(1)
int removeElement(vector<int>& nums, int val)
{
	int index = 0;
    for(int i = 0; i < nums.size(); i++)
    {
        if(nums[i] != val) nums[index++] = nums[i];    
    }
    nums.resize(index);
    return nums.size();
}

Carl C++:

// 时间复杂度:O(n^2)
// 空间复杂度:O(1)
int removeElement(vector<int>& nums, int val) 
{
    int size = nums.size();
    for (int i = 0; i < size; i++) 
    {
        if (nums[i] == val) 
        { 
            for (int j = i + 1; j < size; j++) 
                nums[j - 1] = nums[j];
            i--; 
            size--; 
            }
        }
        return size;
  }