代码随想录——Day 01

代码随想录-力扣刷题-总结笔记01 阅读详情

Day 1:数组01

1. 二分查找

leetcode:704. 二分查找 - 力扣(LeetCode)

#include <iostream>
#include <stdio.h>
#include <vector>
using namespace std;

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size()-1;
        while(left <= right){
            int md = (left + right) / 2;
            if(target < nums[md]){
                right = md-1;
            } else if (target > nums[md]){
                left = md+1;
            } else {
                return md;
            }
        }
        return -1;
    }
};

int main(int argc, char *argv[])
{
	vector<int> s;
    int _num;
    int _target;
    while(cin>>_num){
        s.push_back(_num);
        if(cin.get() == '\n'){
            break;
        }
    }
	cin>>_target;
	
	Solution solution;
	int ret = solution.search(s,_target);
	cout<<ret<<endl;
	return 0;
}

注:

(1)left==right注意是否有意义

(2)区间是否闭合

(3)根据区间的闭合与否,确定边界赋值为md(开区间)、md+1(闭区间)或者md-1(闭区间)

附加题目

leetcode:35. 搜索插入位置 - 力扣(LeetCode)

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size()-1;
        while(left <= right){
            int md = (left + right) / 2;
            if(target < nums[md]){
                right = md-1;
            } else if (target > nums[md]){
                left = md+1;
            } else {
                return md;
            }
        }
        //如果没有找到,最后退出while的区间应该是[right-1, left],所以直接return left
        return left;
    }
};

leetcode:34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)

#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm> // 包含 sort 函数所在的头文件
using namespace std;

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        if(nums.size() == 0){
            return vector<int>{-1,-1};
        }
        int l=-1, r=-1;
        l = returnbound(nums,target-0.5);
        r = returnbound(nums,target+0.5);
        if(l == r){
            return vector<int>{-1,-1};
        }
        return vector<int>{l,r-1};
    }
    int returnbound(vector<int>& nums, double target_lr){
        int left=0;
        int right=nums.size()-1;
        //查找插入的位置
        while(left <= right){
            int mid = (left+right)/2;
            if(target_lr < nums[mid]){
                right = mid-1;
            } else if(target_lr > nums[mid]){
                left = mid+1;
            }
        }
        return left;
    }
};

int main(int argc, char *argv[])
{
	vector<int> _nums;
    int _num;
    int _target;
    while(cin>>_num){
        _nums.push_back(_num);
        if(cin.get() == '\n'){
            break;
        }
    }
	cin>>_target;
	
	Solution solution;
	vector<int> ret = solution.searchRange(_nums,_target);
	//cout<<ret<<endl;
    for(auto a :ret){
        cout<<a<<" ";
    }
	return 0;
}

这个题是在评论区看到一种解法:
直接查找target-0.5target+0.5的插入位置,参考 35. 搜索插入位置 - 力扣(LeetCode)

 很巧妙的一种解法

注意的点:
(1)这里的target±0.5是double类型的,不再是原来的int;

(2)如果数组中存在这个target的话,最后返回的有边界应该-1,因为我们的代码中是查找的插入位置,插入的有边界位置是+1的;

(3)如果returnbound函数return的左右边界相等,就说明数组中不存在这个target,应当返回{-1,-1}。


2. 移除元素

leetcode:27. 移除元素 - 力扣(LeetCode)

首先根据题目的要求,要确保最后的数组中已经删除了目标元素,而不是创建了一个新的数组

这个题最简单是就是暴力解法,挨个查找,找到以后就把这个元素删除,删除以后其后面的所有元素都向前移一位

再一个就是双指针

#include <iostream>
#include <stdio.h>
#include <vector>
using namespace std;

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int slowIndex = 0;
        for(int fastIndex=0; fastIndex<nums.size(); fastIndex++){
            if(nums[fastIndex] != val){
                nums[slowIndex] = nums[fastIndex];
                slowIndex++;
            }
        }
        return slowIndex;
    }
};

int main(int argc, char *argv[])
{
	vector<int> _nums;
    int _num;
    int _target;
    while(cin>>_num){
        _nums.push_back(_num);
        if(cin.get() == '\n'){
            break;
        }
    }
	cin>>_target;
	
	Solution solution;
	int ret = solution.removeElement(_nums,_target);
	cout<<ret<<endl;
	return 0;
}

 注:

(1)快慢指针只需要处理val不等于nums[fastIndex]的情况就可以,等于的情况下只需要让fastIndex++,继续去寻找要移动到前面来的元素即可

(2)主要是要先将fastIndex对应的值赋给slowIndex后再执行slowIndex++的操作!

附加题目

leetcode:26. 删除有序数组中的重复项 - 力扣(LeetCode)

leetcode:283. 移动零 - 力扣(LeetCode)

leetcode:844. 比较含退格的字符串 - 力扣(LeetCode)

leetcode:977. 有序数组的平方 - 力扣(LeetCode)


3. 有序数组的平方

leetcode:977. 有序数组的平方 - 力扣(LeetCode)

简单做法:先平方再排序

#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm> // 包含 sort 函数所在的头文件
using namespace std;

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        vector<int> result;
        //先平方
        for(int i=0; i<nums.size(); i++){
            int sortnum = nums[i] * nums[i];
            result.push_back(sortnum);
        }
        //再排序
        sort(result.begin(),result.end());
    }
};

int main(int argc, char *argv[])
{
	vector<int> _nums;
    int _num;
    //int _target;
    while(cin>>_num){
        _nums.push_back(_num);
        if(cin.get() == '\n'){
            break;
        }
    }
	//cin>>_target;
	
	Solution solution;
	vector<int> ret = solution.sortedSquares(_nums);
	//cout<<ret<<endl;
    for(auto a :ret){
        cout<<a<<" ";
    }
	return 0;
}

双指针做法:

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        vector<int> result(nums.size(), 0);
        int i=0;
        int j=nums.size()-1;
        int k = j;
        while(k > -1){
            if(nums[j] * nums[j] > nums[i] * nums[i]){
                result[k] = nums[j] * nums[j];
                j--;
            } else {
                result[k] = nums[i] * nums[i];
                i++;
            }
            k--;
        }
        return result;
    }
};

注:

定义一个新数组result,和A数组一样的大小,让k指向result数组终止位置。

如果A[i] * A[i] < A[j] * A[j] 那么result[k--] = A[j] * A[j]; 

如果A[i] * A[i] >= A[j] * A[j] 那么result[k--] = A[i] * A[i]; 

代码随想录算法训练营Day01 | 704. 二分查找、27. 移除元素 阅读详情

相关推荐

避坑指南:Dify+Docker+Ollama离线部署实战与疑难解析

本文详细解析了在国产化系统(如银河麒麟V10)内网环境中,如何从零开始离线部署Dify、Docker与Ollama的全栈AI应用开发平台。文章重点拆解了Docker安装中的“没有Release文件”和“GPG密钥错误”等典型报错解决方案,并提供了Ollama离线模型导入与Dify连接配置的完整实战指南,旨在帮助开发者高效完成本地部署,避开常见陷阱。

dd012的博客 429

网站收藏箱

文章内容都是笔者日常工作与学习接触到,并且觉得不错的网站,特收录在册,欢迎广大读者提供补充,文章会持续更新

沉梦听雨的博客 1万+

SAP 配额修改 + 修改记录写入实现

采购配额修改并写入修改记录 cdhdr 和 cdpos

GAVIN 1028

算法速成之代码随想录

有些同学想要学习算法题,但是时间很紧,自己的基础也不是很好,想要在空余时间完全掌握所有算法题确实有点不切实际了,终于去学习了遇到难题又半途而废,于是我总结了一下刷代码随想录题目的方法先看b站视频:BV1fA4y1o715,有规划的看,每一类题可以看一到两道,看完去做题,感觉基本了解了就可以直接看代码随录博客的题目跟着做,因为看视频较为费时间,博客中的注释非常详细;写题时候,,实在无从下手就他的,看完应该都能自己写了,如果连思路都看不懂,那么就求助gpt或者去看他的视频;每周写题也要有一定的规划,

qq_63728673的博客 7016

代码随想录刷题笔记 (python版本) 持续更新.....

代码随想录刷题笔记

hello world 1万+

【leetcode刷题总结】——代码随想录(链表总结)

什么是链表,链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。

lingxw的博客 4919

代码随想录day01

1.数组是村放在连续内存空间上的相同类型数据的集合数组可以方便的通过下标索引的方式获取到下标对应的数据。看过代码随想录之后的解题思路。看过代码随想录之后解题思路。代码实现: 左闭右闭。

Xiaoxiaoniao16的博客 1183

代码随想录第58期day01

原理就是定义两个指针,一个为快指针,一个为慢指针,快指针先遍历,再从里面写一个判断语句,如果数组值与目标值不相等,那么就可以把快指针对应的元素值复制到慢指针对应的数组的位置,这样就能实现与目标值相等的元素能被覆盖,以此完成两重for循环完成的任务,代码如下:`解析:这题还没看双指针怎么解,我用了暴力解,我的思路如下,注意到nums[i]的最大值为10^4 ,数组空间最大也是这么多,就想到用hash映射到重新开辟的数组里面,在遍历新数组里面对应的值,来实现求他的下标的平方存在数组里面,以至于排好序。

qq_64919637的博客 809

代码随想录算法训练营Day01~02

二分、前缀和、滑动窗口、双指针、模拟

rachel_pretty的博客 1052

代码随想录Day01

双指针,左指针值为val的时候与右指针进行交换(覆盖),移动左指针已处理交换后仍为val的情况,同时移动右指针。双指针,有序数组,不用管数组值的正负,在两头的平方有一个是最大的,双指针取大的值,移动取值的指针。

weixin_53563082的博客 242

代码随想录刷题-day01 704. 二分查找

代码随想录刷题

2301_77084113的博客 117

代码随想录Day01

今天状态不好,又困,注意力也集中不了,写过的题没写出来也是让人情绪不好。希望能够坚持,慢慢调整状态吧。股票回本也遥遥无期~

qq_45655634的博客 913

代码随想录 Day01

leetcode基础 二分查找 移除元素

weixin_41910116的博客 2450

代码随想录Day35 | 01背包问题 二维,01背包问题 一维,416.分割等和子集

动态规划经典问题dp定义:表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少状态转移方程:初始化:遍历:先遍历行,也就是先遍历物品,再遍历背包容量 01背包问题 一维 因为在二维里,的值只与左上角(上一行且左边)的值有关,所以只保存一行的值即可。状态转移方程:遍历顺序:因为要用到左上角的值,在一维里就是左边的值,所以要从后往前遍历,不然会影响到左边的值 416.分割等和子集 难点在于将问题转换为动态规划问题:然后就是背包问题的代码形式 [j]:

weixin_43992121的博客 414

代码随想录》打卡Day01

代码随想录》打卡Day01

qq_59615070的博客 321

Java 代码随想录Day01

完成内容:数组理论基础 704. 二分查找 27. 移除元素 977.有序数组的平方。

abc_daa的博客 660

代码随想录算法训练营Day01

LeetCode数组相关例题:二分查找、双指针、暴力解法

whaledown的博客 1882

OKUMA DevelopKit_Ver2.0 API开发包及操作说明.zip

OKUMA机床二次开发包

上一篇: Unity开发记录
下一篇: 代码随想录——Day02
_小手冰凉
博客等级 码龄5年 5粉丝 · 3原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值