数组篇(代码随想录二刷+总结)
1.二分查找
leetcode 704
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length;
while(left<right){
int mid = left+(right-left)/2;
// 左闭右开
if(nums[mid]>target){
right = mid;
}else if(nums[mid]<target){
left = mid+1;
}else{
return mid;
}
}
return -1;
}
public int search(int[]nums,int target){
// 2.左闭右闭
int left = 0;
int right = nums.length-1;
int mid = -1;
while(left<=right){
mid = (left+right)/2;
if(target==nums[mid]){
return mid;
}else if(target<nums[mid]){
right = mid-1;
}else{
left = mid+1;
}
}
return -1;
}
这个题关键是一定要明确你的区间情况,到底是左闭右开,还是左闭右闭。这不仅体现到while循环条件上,而且初试left,right的时候也一样要明确,比如左闭右开,初始right=nums.length;
2.移除元素
leetcode 27
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
此题主要是针对于双指针方法题解,思路很简单,但是第一次见不容易想到。代码如下:
public int removeElement(int[] nums, int val) {
int slow=0,fast=0;
while(fast<nums.length){
if(nums[fast]!=val){
nums[slow] = nums[fast];
slow++;
}
fast++;
}
return slow;
}
slow当作新数组的元素位置,fast作为遍历原来数组的索引;当nums[fast]==val 说明要删除,这个时候不应该把元素加入到新的数组中,直接fast++;而nums[fast]!=val时,则应该把旧数组的元素放入新数组中。针对双指针类型的题,怎么想到是关键。后面的博客将进一步总结双指针方法的特点
3.有序数组的平方
leetcode 977
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
public int[] sortedSquares(int[] nums) {
int left = 0;
int right = nums.length-1;
int[] result = new int[nums.length];
int index = nums.length-1;
while(left<=right){
if(Math.abs(nums[right])<Math.abs(nums[left])){
result[index--] = nums[left]*nums[left++];
}else{
result[index--] = nums[right]*nums[right--];
}
}
return result;
}
双指针方法,合理生成一个新数组表示结果result,不然不好操作。
4.长度最小的子数组
leetcode 209
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
public int minSubArrayLen(int target, int[] nums) {
int left = 0,right = 0;
int result = Integer.MAX_VALUE;
int sum=0;
for(;right<nums.length;right++){
sum+=nums[right];
while(sum>=target){
result = Math.min(result,right-left+1);
sum-=nums[left++];
}
}
return result==Integer.MAX_VALUE?0:result;
}
滑动窗口,外层循环窗口右侧,内层循环左侧
5.螺旋矩阵Ⅱ
leetcode 59
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
public int[][] generateMatrix(int n) {
int[][] martix = new int[n][n];
int top=0,bot=n-1,left=0,right=n-1;
int fill=1;
while(fill<=n*n){
// 从左到右
for (int i = left;i<=right;i++){
martix[top][i] = fill++;
}
top++;
// 从上到下
for (int i = top; i <= bot; i++) {
martix[i][right] = fill++;
}
right--;
// 从右到左
for (int i = right;i >= left;--i){
martix[bot][i] = fill++;
}
bot--;
// 从下到上
for (int i = bot; i >= top; --i) {
martix[i][left] = fill++;
}
left++;
}
return martix;
}
直接进行模拟即可