Bootstrap

代码随想录算法训练营第一天:数组Leetcode 704|27|977

Leetcode 704

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1

二分法

#思路:使用二分法前提是数组为有序数组,同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的。

  明确定义区间:

        左闭右闭[left,right],包含left&right, 即left可等于right是合法区间

        左闭右开[left,right):即不包含right值

#解题:采用左闭右闭

Leetcode 27

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

双指针法

#思路:要知道数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。

#解题:快慢指针, 快指针用来获取新数组中的元素,慢指针是用来获取新数组中需要更新的位置

Leetcode 977

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

双指针法以及排序法

#思路:数组其实是有序的, 只不过负数平方之后可能成为最大数了。

那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。

此时可以考虑双指针法了,i指向起始位置,j指向终止位置。

定义一个新数组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]; 。

#解题:

排序法
双指针法

定义新的数组result和索引下标

;