算法一刷 数组(上)
704、二分查找
https://leetcode.cn/problems/binary-search/description/
题目:
解析:
这个题目是有序数组,还强调了数组中没有重复元素,在此条件下使用二分查早返回的元素下标可能不是唯一的,这些都是二分查早的前提。而对于二分查早来说我们就需要运用一下口诀坚持开闭一致性。
代码:
class Solution {public int search(int[] nums, int target) {if(target<nums[0]||target>nums[nums.length-1]){return -1;}int left=0,right=nums.length-1;while(left<=right){int mid=left+((right-left)>>1);if(nums[mid]==target){return mid;}else if(nums[mid]<target){left=mid+1;}else{right=mid-1;}}return -1;}
}
这是左闭右闭的写法,主要是需要观察以下几个方面
27、移除元素
https://leetcode.cn/problems/remove-element/
题目:
解析:
这个题目主要是用到了快慢指针的方法,我们可以定义一个慢指针和一快指针,快指针主要是用于先一步判断便利到的元素是否和要移除到的元素一样,如果变量到的元素等于要移除的元素,那么慢指针就不需要移动。
答案:
class Solution {public int removeElement(int[] nums, int val) {int slow=0,fast=0;for(;fast<nums.length;fast++){if(nums[fast]!=val){nums[slow]=nums[fast];slow++;}}return slow;}
}
977、有序数组的平方
https://leetcode.cn/problems/squares-of-a-sorted-array/description/
题目:
解析:
只需要将原来的数组平方,然后同时定义两个指针,尾指针和头指针,对其进行遍历得出答案。我们将正数的相对位置保持不变,调整负数的平方的后的相对位置。
答案:
class Solution {public int[] sortedSquares(int[] nums) {int left=0,right=nums.length-1;int [] result = new int[nums.length];int index= result.length-1;while(left<=right){if(nums[left]*nums[left]>nums[right]*nums[right]){result[index--]=nums[left]*nums[left];++left;}else{result[index--]=nums[right]*nums[right];--right;}}return result;}
}
209、长度最小子数组
https://leetcode.cn/problems/minimum-size-subarray-sum/
题目:
解析:
本题的解题思路是滑动窗口。滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得到我们所需要的结果。我们需要使用一个for循环来表示滑动窗口的终止位置即可。
答案:
class Solution {public int minSubArrayLen(int s, int[] nums) {int left = 0;int sum = 0;int result = Integer.MAX_VALUE;for (int right = 0; right < nums.length; right++) {sum += nums[right];while (sum >= s) {result = Math.min(result, right - left + 1);sum -= nums[left++];}}return result == Integer.MAX_VALUE ? 0 : result;}
}