代码随想录的第一天,主题是数组相关。因为之前有跟着代码随想录刷过一阵的题,因此这个刷题顺序无比熟悉。
第一天的题目是:207:二分查找;27:删除元素
今天的节奏比较快,因为是简单题并且之前已经刷过了。虽然解法忘记了,但是稍微看了下卡哥的解答,很容易就回忆了起来。
207:二分查找
题目描述:
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
示例:
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
题目要点:
1. 有序的数组 2. 元素不重复
解题思路:
方法一:左闭右闭集合。将 target 属于集合[left, right].
如果使用这种方法就要注意条件的设置是while(left <= right)。
方法二:左闭右开集合。也就是说 target 属于[left, right).
如果使用这种方法就要注意条件的设置是while(left < right)。
个人易错点:
1. 注意题目是要返回数组的元素值还是元素下标。
2. 注意left +(right-left)/2和(left+right)/2的区别:前者不会内存溢出;后者一旦 left 或者 right 都超过 int 最大值的一半时,相加就会溢出。
27:移除元素
题目描述:
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例:
输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。
解题思路:
方法 一:暴力破解
设定 i 和 j两个整型变量,i 用来遍历数组;j 用来更新数组。找到与 val 相同的元素,就把后一位的元素全部往前移。
方法 二:快慢指针
设定 slowIndex 和 fastIndex 两个整型变量作为指针。fastIndex 用来遍历元素,并与 val 比较。如果 与 val 不相同的元素产生,则利用 slowIndex 进行储存并计数。最后返回 slowIndex。
个人易错点:
1. 数组的元素不能删除,只能覆盖。
2.注意比较两种方法的时间/空间复杂度。