代码随想录算法训练营第一天 | 数组概念、二分查找、双指针
数组概念
数组是存放在连续内存空间上的相同类型数据的集合。
二分查找
注意边界,常见的边界为左闭右开,左闭右闭。
如何判断$while()$循环条件是否带等号。
左闭右开[left, right) 不带等号
左闭右闭[left, right] 带等号
闭区间方需要进行“左+1 右-1”的操作,题目做35、35,拓展题34题没有思路,其他题还没看。
/*
* [704] 二分查找
*/
// @lc code=start
class Solution {
public int search(int[] nums, int target) {
int right = nums.length - 1;
int left = 0;
int mid = 0;
while (left <= right) {
mid = left + (right - left) / 2;
if (nums[mid] == target){
return mid;
} else if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
}
/*
* [35] 搜索插入位置
*/
// @lc code=start
class Solution {
public int searchInsert(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
int mid = 0;
while (right >= left) {
mid = left + (right - left) / 2;
if (nums[mid] == target) {
return mid;
} else if (nums[mid] < target){
left = mid + 1;
} else {
right = mid - 1;
}
}
return left;
}
}
双指针
双指针思想主要是快慢更新数组,一个指针遍历数组,一个指针更新数组
做题 27、977 ,拓展题还没有看
/*
* [27] 移除元素
*/
// @lc code=start
class Solution {
public int removeElement(int[] nums, int val) {
int sign = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != val) {
nums[sign] = nums[i];
sign++;
}
}
return sign;
}
}
/*
* [977] 有序数组的平方
*/
// @lc code=start
class Solution {
public int[] sortedSquares(int[] nums) {
int left = 0;
int right = nums.length - 1;
int[] temp = new int[nums.length];
for (int i = temp.length - 1; i >= 0; i--) {
if (abs(nums[right]) > abs(nums[left])) {
temp[i] = nums[right]*nums[right];
right--;
} else {
temp[i] = nums[left]*nums[left];
left++;
}
}
return temp;
}
private int abs(int a){
if (a < 0) {
a = -a;
}
return a;
}
}

浙公网安备 33010602011771号