理论数组基础
数组是存放在连续内存空间上的相同类型数据的集合。
- 数组下标都是从0开始的
- 数组内存空间的地址是连续的
- 数组的元素是不能删的,只能覆盖
二分查找
大白话就是对半分然后找所需元素所在的一边,丢弃另一边,然后再对半分,直到找到需要的元素。
该方法的前提:1.数组是有序数组;2.数组中无重复元素。
方法一:左闭右闭
定义target在一个左闭右闭的区间里,也就是【left,right】
- while(left<=right)
- if(nums[mid]>target) right要赋值为mid-1,因为当前这个nums【mid】一定不是target,那么接下来要查找的左区间结束下标位置就是mid-1
代码一
class Solution{ public int search(int[]nums,int target) int left = 0,right = nums.length-1; while(left<=right){ int mid = left + (right+left)/2; if(nums[mids]==target) return mid; else if(nums[mid]<target) left=mid+1; else if(nums[mid]>target) right=mid+1; } return -1; }
方法二:左闭右开
定义target在左闭右开的区间里,也就是【left,right)
- while(left<right)
- if(nums[mid]>target) right更新为mid,因为当前nums[mid]不等于target,去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为mid,并且下一个查询区间不包含mid。
代码二
class Solution{ public int search(int[]nums,int target){ int left = 0,right = nums.length while(left<right){ int mid=left+(right+left)/2; if(nums[mid]=target) return mid; else if(nums[mid]<target) left=mid+1; else if(nums[mid]>target) right=mid; } return -1; } }
移除元素
大白话就是移除掉等于val的元素,再输出剩下的数组。
同相快慢指针法
class Solution{ public int removeElement(int[]nums,int val){ int slowIndex=0; for(int fastIndex=0;fastIndex<nums.length;fastIndex++){ if(nums[fastIndex]!=val){ nums[slowIndex]=nums[fastIndex]; slowIndex++; }} return slowIndex; } }
相向双指针法
class Solution{ public int removeElement(int[]nums,int val){ int left=0; int right=nums.length-1; while(left<=right){ if(nums[left]==val){ nums[left]=nums[right]; right--; } else{ left++; } } return left; }