今日学习的文章链接如下:

代码随想录 (programmercarl.com)

代码随想录 (programmercarl.com)

704. 二分查找

自己看到题目的第一想法

拿到题目首先想办法,一个是从头到尾遍历(这肯定很慢),还有一种办法就是二分法。想了半天决定应该先排序,后定睛一看,发现自己漏掉题目中的已知条件“按升序排列”……想到了解决办法,但不知道如何用编程语言表达,想用Java解,但是Java太久没用忘差不多了……

遇到的主要问题
  1. 脑海中有框架的感觉了,不知道如何循环起来;

  1. java输出语句、if语句、函数得看一眼;

  1. 不知道怎么表示每次区间变化之后的中间量;

看完代码随想录之后的想法

于是看解析,由于解析的代码是用c++写的,我没接触过c++,误以为是Java,看了半天没看懂,也看不进去。中途放弃了大概五六个小时去摆烂了,又处理了一下和男友之间的事情,直到晚上十点半才重新回到书桌前看代码,看的是后面c的代码,一下豁然开朗了。

一些关键点
  1. 用left和right表示区间;

  1. 用middle表示区间的中间值,middle = (left + right)/2(这里我又犯了一个错误,算两个数的中间值我用一种特别麻烦的表示方法,其实就是左加右除以2这么简单的表示);

  1. 用while循环表示重复比较的迭代的过程;

自己实现过程中遇到哪些困难

接下来自己写了一遍代码,在LeetCode上尝试,提示“超出时间限制”,将卡哥的代码与自己写的代码逐字比对。

不对比不知道一对比吓一跳,有几个地方马虎写错了。+写成了-,nums[middle]外头的nums被我丢了......改过之后顺利通过。

//左闭右闭
int search(int* nums, int numsSize, int target){int left, right, middle;left = 0;right = numsSize - 1;middle = 0;while(left <= right){middle = (right + left)/2;if(target > nums[middle]){left = middle + 1;}if(target < nums[middle]){right = middle - 1;}if(target == nums[middle]){return middle;}}return -1;
}
//左闭右开
int search(int* nums, int numsSize, int target){int left, right, middle;left = 0;right = numsSize;//把原来的闭区间 变成现在的开区间 改变的是右值 middle = 0;while(left < right)// 这里很妙 把区间扩大了一下 遇到{5}找5这种情况也没问题 left = 0 right = 1 {int middle = left + (right - left) / 2;// 由于整个大的改成了开区间 所以这里是这样表示中间值的 if(target > nums[middle]){left = middle + 1;}if(target < nums[middle]){right = middle;}if(target == nums[middle]){return middle;}}return -1;
}

27. 移除元素

自己看到题目的第一想法

c语言如何删除数组里的元素?

最开始的想法是遍历数组,找到其中num[i]值为val的元素,一位一位往前覆盖。

用的第一个测试用例通过了,但是提交失败,发现换了一个测试用例我这个代码就不好用了,因为我在一位一位往前覆盖的同时,让后面多余的几位都得0了。这个测试用例的val恰好就是0。于是修改了一下,直接修改numsize的值就可以解决这个问题了。

int removeElement(int* nums, int numsSize, int val)
{int k = 0;int i = 0;int j = 0;for(i = 0; i < numsSize; i++){//printf("i = %d\n", i);if (nums[i] == val){for(j = i; j <= numsSize - 2; j++){nums[j] = nums[j+1];//printf("j = %d\n", j);}numsSize = numsSize - 1;i = i - 1;  }}return numsSize;
}

看完代码随想录之后的想法

双指针法

双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。

定义快慢指针

  • 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组

  • 慢指针:指向更新 新数组下标的位置

int removeElement(int* nums, int numsSize, int val){int slow = 0;for(int fast = 0; fast < numsSize; fast++) {//若快指针位置的元素不等于要删除的元素if(nums[fast] != val) {//将其挪到慢指针指向的位置,慢指针+1nums[slow++] = nums[fast];/*这里也可以写成nums[slow] = nums[fast];slow = slow + 1;*/}}//最后慢指针的大小就是新的数组的大小return slow;
}

今日收获,学习时长3h

重要知识点
  1. 数组为有序数组,同时题目还强调数组中无重复元素——可以考虑二分法

  1. Java四种输出语句

System.out.println(1111);//换行打印
System.out.print(1111);//不换行打印
System.out.write(2222);//字节输出
System.out.printf("%+8.3f\n", 3.14);//按格式输出
  1. Java函数定义

https://blog.csdn.net/HoHiuChing/article/details/77480471

反思

看题没认真仔细看,浮皮潦草就扫过去了,导致忽略已知条件,影响做题。下次看题目要一个字一个字看,可以读两遍以上再开始想做题的办法。

中途遇到Java语言和c++语言的一点小挑战就以为自己遇到了多难多难的问题,严重高估问题的难度、严重低估自己对问题的理解度,导致放弃。并且假期在家自制力较差,拿起手机就放不下。需要管控一下学习期间手机的滥用。

写代码不仔细,小问题频出。下次写完之后仔细再回看一遍。

代码随想录算法训练营第一天 | 数组理论基础,704. 二分查找,27. 移除元素相关推荐

  1. 代码随想录Day01:数组理论基础、二分查找、移除元素

    目录 数组理论基础.二分查找.移除元素 1.数组理论基础 2.Leetcode704.二分查找 方法一 左闭右闭: 方法二 左闭右开: 方法三 左开右开: 方法四 左开右闭: 3.Leetcode27 ...

  2. Leetcode 704.二分查找 27.移除元素 代码随想录day1

    本系列目的在于跟练代码随想录,以及记录自己在数据结构与算法方面的一些学习 704.二分查找 其实之前自己在随便刷题的时候看过这道题目,就是一个纯新手的大状态,第一次听到二分查找这样的东西,然后跟着题解 ...

  3. 代码随想录算法训练营第一天|704二分查找 27移除元素

    理论基础 1.数组是存放在连续内存空间上的相同类型数据的集合 2.数组可以方便的通过下标索引的方式获取到下标下对应的数据 3.数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要 ...

  4. 代码修炼Day1_LeetCode704二分查找27移除元素

    代码修炼Day1_LeetCode704二分查找&27移除元素 一些数组基本知识 数组下标都是从0开始的 数组内存空间的地址是连续的 题目链接: 力扣704二分查找 二分查找思想 针对升序数组 ...

  5. 代码随想录算法训练营第一天 704 二分查找、27 移除元素

    代码随想录算法Day1 | 704. 二分查找.27. 移除元素 Last edited time: April 5, 2023 11:27 AM 数据理论基础 数组是存放在连续内存空间上的相同类型数 ...

  6. 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素。

    704. 二分查找 题目链接:704. 二分查找 - 力扣(LeetCode) 第一天代码跑题了,做出来了但是没有使用二分法,看了讲解,对于左闭右闭和左闭右开还需要多思考,并没有完全理解.那就先总结一 ...

  7. 代码随想录算法训练营第一天 | 704.二分查找、27.移除元素题目

    704.二分查找 题目链接:二分查找 思路: 1.从头开始遍历,首先如果不用二分查找法,最容易想到的就是直接暴力查找,时间复杂度为O(n)直接从头开始遍历一便就行.这样如果数据量庞大会运行时间较长. ...

  8. 代码随想录算法训练营第一天

    704. 二分查找. 27. 移除元素 1. 二分查找 int search(int* nums, int numsSize, int target){int middle = 0;int left ...

  9. 代码随想录算法训练营day13 | 239. 滑动窗口最大值 | 347.前 K 个高频元素

    一.239. 滑动窗口最大值 from collections import dequeclass MyQueue: #单调队列(从大到小def __init__(self):self.queue = ...

最新文章

  1. 用js实现时间减去前1小时、7天、1月、1年
  2. 深入浅析nginx部署及简单优化
  3. 图像窗口方面 window
  4. java服务限流_SpringCloud微服务:Sentinel哨兵组件,管理服务限流和降级
  5. iOS - 利用 UIBezierPath 绘制圆弧
  6. hdoj - 1258 Sum It Up hdoj - 1016 Prime Ring Problem (简单dfs)
  7. ipad连接电脑_这些应用让iPad生产力分分钟UP
  8. php默认字体是什么,在word中系统默认的中文字体和字号是什么,word默认字体
  9. Fabric1.4源码解析:Peer节点启动过程
  10. 零基础学习.NET平台和Csharp编程开发
  11. pythongui界面实例_wxPython:python首选的GUI库实例分享(5)
  12. PicoNeo开发中遇到的问题(一)
  13. GTC '19 经典回顾 | 如何编排和创造二次元中的舞蹈?
  14. JavaScript 防抖(debounce)、截流(throttle)
  15. win7开机卡在正在启动_手把手教你大白菜PE启动盘安装win7最详细的图解教程
  16. 深入了解Linux内核MMU管理机制
  17. 舍弗勒城市车辆转向系统研究完成,可实现全自动平行泊车
  18. 学习前端第三天-----小程序制作
  19. 百度语音合成与语音识别api使用(Java版本)
  20. 区块链中的石墨烯技术是什么

热门文章

  1. 三封“鸡毛信”搅热网络 黄健翔将上网揭秘辞职原因
  2. 百度/谷歌/搜狗/360搜索/新网站提交与收录入口
  3. 北京尚学堂14章编程题
  4. 极简的欧洲史-读书笔记
  5. 蓝翔技术学院计算机,蓝翔计算机学子马安然:我眼中的蓝翔
  6. Typora基础使用教程
  7. 小红书笔记别人看不到是怎么回事?
  8. android tab使用
  9. 关于色带 Banding
  10. java中getname的意思_getname是什么意思