【算法训练营day1】LeetCode704. 二分查找 LeetCode27. 移除元素
【算法训练营day1】LeetCode704. 二分查找 LeetCode27. 移除元素
LeetCode704. 二分查找
题目链接:704. 二分查找
初次尝试
看到题目标题是二分查找,所以尝试使用二分查找的思想,代码思路是一直循环二分,直到两个指针相等,再判定所指元素是否等于target,这样对于任何输入都需要二分至尽头才能得出结论,果不其然提交后超时。
class Solution {
public:
int search(vector<int>& nums, int target) {
int low = 0, up = nums.size() - 1;
while (true) {
if (target <= nums[(low+up)/2]) {
up = (low + up) / 2;
}
else {
low = (low + up) / 2 + 1;
}
if (low == up) {
return target == nums[low] ? low : -1;
}
}
}
};
看完代码随想录后的想法
意识到了不需要对于任何输入都二分到尽头,可以在二分的过程中判断target是否与二分的中间点相等,如果相等就可以直接返回中间点的下标(当然这是在数组元素都不重复的前提下)。这是符合逻辑的,毕竟如果在二分判定的过程中已经找到了和target相等元素的下标,何必继续二分到尽头呢?直接返回不就完事了!
关于题解中讲到的循环不变量,也就是左闭右闭等的问题,我感觉对我个人不是难点,在初次尝试中就有类似的思考过程,感觉对于边界开闭的留意已经是一种习惯了,故在此不再赘述。
class Solution {
public:
int search(vector<int>& nums, int target) {
int low = 0, up = nums.size() - 1;
// 左闭右闭
while (low <= up) {
int mid = (low + up) / 2;
if (target < nums[mid]) up = mid - 1;
else if (target > nums[mid]) low = mid + 1;
else return mid;
}
return -1;
}
};
LeetCode27. 移除元素
题目链接:27. 移除元素
初次尝试
思路是使用暴力解法,直接两个for循环,外层遍历数组,内层寻找等于val的元素并更新数组。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int numslen = nums.size();
for (int i = 0; i < numslen; i++) {
if (nums[i] == val) {
for (int j = i + 1; j < numslen; j++) {
nums[j-1] = nums[j];
}
numslen--;
i--;
}
}
return numslen;
}
};
然后想到当有连续多个等于val的元素时,每个都要更新一次实在是平添时间复杂度,于是修改了一下,当遇到连续多个等于val的元素时,判定一下有几个,然后一次性更新数组,看似优化了,其实换汤不换药,仍然是嵌套着的for循环,没有大的优化。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int numslen = nums.size();
for (int i = 0; i < numslen; i++) {
int k = 0;
for (int j = i; j < numslen; j++) {
if (nums[j] == val) k++;
else break;
}
if (k > 0) {
for (int j = i + k; j < numslen; j++) {
nums[j-k] = nums[j];
}
numslen -= k;
}
}
return numslen;
}
};
看完代码随想录后的想法
双指针真是yyds!其实看到题解视频的开头我就突然明白怎么用双指针了,定义一个慢指针和一个快指针,快指针负责遍历整个数组,找出可以留下来的元素,每找到一个就把它告诉慢指针,慢指针只需要听令,把可以留下来的元素放到现在的坑里,然后+1跳到下一个坑即可。之所以有快慢指针之分是因为每次for循环,快指针都会+1,而慢指针看情况+1(当快指针指向可以留下来的元素的时候),所以慢指针一定不快于快指针。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int numslen = nums.size();
int slow = 0;
for (int fast = 0; fast < numslen; fast++) {
if (nums[fast] != val) {
nums[slow++] = nums[fast];
}
}
return slow;
}
};
今日的小想法
对于刷题初期的我,感觉看到题目首先想到的还是如何暴力解出来,然后再进行优化,而题解往往有一些另辟蹊径的解法,所以多积累解题技巧是现阶段的主要任务。今日用时:约4h
【算法训练营day1】LeetCode704. 二分查找 LeetCode27. 移除元素的更多相关文章
- js基本算法:冒泡排序,二分查找
知识扩充: 时间复杂度:算法的时间复杂度是一个函数,描述了算法的运行时间.时间复杂度越低,效率越高. 自我理解:一个算法,运行了几次时间复杂度就为多少,如运行了n次,则时间复杂度为O(n). 1.冒泡 ...
- Java数据结构和算法总结-数组、二分查找
前言:在平时开发中数组几乎是最基本也是最常用的数据类型,相比链表.二叉树等又简单很多,所以在学习数据和算法时用数组来作为一个起点再合适不过了.本篇博文的所有代码已上传 github ,对应工程的 ar ...
- 数据结构和算法设计专题之---二分查找(Java版)
1.前提:二分查找的前提是需要查找的数组必须是已排序的,我们这里的实现默认为升序 2.原理:将数组分为三部分,依次是中值(所谓的中值就是数组中间位置的那个值)前,中值,中值后:将要查找的值和数组的中值 ...
- 数据结构和算法:Python实现二分查找(Binary_search)
在一个列表当中我们可以进行线性查找也可以进行二分查找,即通过不同的方法找到我们想要的数字,线性查找即按照数字从列表里一个一个从左向右查找,找到之后程序停下.而二分查找的效率往往会比线性查找更高. 一. ...
- LeetCode704 二分查找
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1. 示例 1: 输入: num ...
- Leedcode算法专题训练(二分查找)
二分查找实现 非常详细的解释,简单但是细节很重要 https://www.cnblogs.com/kyoner/p/11080078.html 正常实现 Input : [1,2,3,4,5] key ...
- leetcode704二分查找
title: 二分查找 题目描述 题目链接:二分查找 解题思路 二分模板默写 int search(vector<int>& nums, int target) { int lef ...
- python算法双指针问题:二分查找
这里要注意的是//向下取整,下次循环时,如果大于查找的数字,start+1. 并且,只能向下取整,如果向上取整. 那么,在比较第一个数时,start = 0 .end = 1.mid = 1.就会进入 ...
- [Swift]LeetCode704. 二分查找 | Binary Search
Given a sorted (in ascending order) integer array nums of nelements and a target value, write a func ...
随机推荐
- Java开发学习(二十二)----Spring事务属性、事务传播行为
一.事务配置 上面这些属性都可以在@Transactional注解的参数上进行设置. readOnly:true只读事务,false读写事务,增删改要设为false,查询设为true. timeout ...
- 关于 java 的动态绑定机制
关于 java 的动态绑定机制 聊一聊动态绑定机制, 相信看完这篇文章,你会对动态绑定机制有所了解. 网上大多一言概括: 当调用对象的时候,该方法会和该对象的内存地址/运行类型绑定. 当调用对象的属性 ...
- 金秋十月 - Apache DolphinScheduler 收获 2 位新 Committer
点击上方蓝字关注 Apache DolphinScheduler Apache DolphinScheduler(incubating),简称"DS", 中文名 "海豚调 ...
- Luogu3870 [TJOI2009]开关 (分块)
线段树做法很简单,但分块好啊 #include <iostream> #include <cstdio> #include <cstring> #include & ...
- 微服务性能分析|Pyroscope 在 Rainbond 上的实践分享
随着微服务体系在生产环境落地,也会伴随着一些问题出现,比如流量过大造成某个微服务应用程序的性能瓶颈.CPU利用率高.或内存泄漏等问题.要找到问题的根本原因,我们通常都会通过日志.进程再结合代码去判断根 ...
- java-循环
1.循环:反复执行一段相同或相似的代码(逻辑相似或者相同)2.循环三要素: 1.循环变量的初始化 2.循环的条件(以循环变量为基础) 3.循环变量的改变(向着循环的结束变)循环变量:在整个循环过程中所 ...
- 记录Java类型推断关键字var的一种特殊用法
关于Java的var类型推断,有一种特殊用法,如下: 没有var类型之前声明一个匿名类对象,并调用它的方法. Object obj = new Object() { public void test( ...
- Excelize 2.5.0 正式发布,这些新增功能值得关注
Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准.可以使用它来读取.写入由 Microsoft Exc ...
- 从零开始实现一个MyBatis加解密插件
作者:vivo 互联网服务器团队- Li Gang 本篇文章介绍使用MyBatis插件来实现数据库字段加解密的过程. 一.需求背景 公司出于安全合规的考虑,需要对明文存储在数据库中的部分字段进行加密, ...
- Mybatis-Plus高级之LambdaQueryWrapper,Wrappers.<实体类>lambdaQuery的使用
一.前言 小编今天又来分享干货了,绝对的干净又卫生,大伙请放心食用哈!Mybatis-Plus我们经常使用,但是里面的很多功能,小编开始只是知道一点点,做个增删改查没问题.小编在新项目中发现,大神们不 ...