【代码训练营Day01】数组part1
文章目录
- 数组理论基础回顾
- 二分查找
- 移除元素
- 有序数组的平方
数组理论基础回顾
注意几个重点就行:
- 一维数组普遍在内存中都是连续分配的
- 下标从0开始
- 删除或者增添的时候需要移动其他元素(除了尾元素)
- 数组元素只能覆盖不会删除
- 数组内存空间会预分配,不够会走扩容机制,结束会被gc,不会随意的减少分配
二分查找
题目链接:704. 二分查找
算法可视化图解:二分查找原理
双指针法解题思路:
- 首先初始化前后指针,分别处于列表的两端
- 将两指针的中间节点作为比较元素(索引相加除2,向下取整)
- 如果比目标元素大,则将后指针移动到中间节点的前一个位置
- 如果比目标元素小,则将前指针移动到中间节点的后一个位置
- 如果与目标元素相同,则找到
- 如此循环往复直到前后指针位置异常(前指针在后)
以下是结题代码:
class Solution {public int search(int[] nums, int target) {int head = 0;int end = nums.length - 1;int middle = (head + end) / 2;while (head <= end) {if (nums[middle] < target) {head = middle + 1;middle = (head + end) / 2;}else if(nums[middle] > target) {end = middle - 1;middle = (head + end) / 2;}else {return middle;}}return -1;}
}
移除元素
题目链接:27. 移除元素
双指针法解题思路:
- 首先将双指针都指向表头
- head指针作为填充指针,从表头开始填充
- end指针作为遍历指针,遍历数组
- 开始遍历数组
- 遇到非移除元素通过head指针填充,然后head指针后移,同时计数
- 如果是要移除元素,则进入下一次循环
class Solution {public int removeElement(int[] nums, int val) {int head = 0;int count = 0;for (int i = 0; i < nums.length; i++) {if(nums[i] == val) {continue;}nums[head++] = nums[i];count++;}return count;}
}
有序数组的平方
题目链接:977. 有序数组的平方
此题可以暴力排序但并没有双指针法简洁,因为本题是一个有序数组,那么平方之后的最大值只可能在两端出现。
双指针法解体思路:
- 初始化双指针指向数组的头尾,初始化一个新数组
- 比较两指针所指元素的平方大小
- 如果左指针的更大,则将左指针的元素平方填充到新数组,然后左指针右移
- 如果右指针的更大,则将右指针的元素平方填充到新数组,然后右指针左移
- 如此循环往复直到左右指针位置异常
代码如下:
class Solution {public int[] sortedSquares(int[] nums) {int head = 0;int end = nums.length -1;int[] result = new int[nums.length];int write = nums.length -1;while(head <= end) {int headNum = (int)Math.pow(nums[head],2);int endNum = (int)Math.pow(nums[end],2);if(headNum >= endNum) {result[write--] = headNum;head++;}else {result[write--] = endNum;end--;}}return result;}
}