一、二分查找
- 704.二分查找 leetcode链接
1.二分查找方法概述
- 二分查找是针对有序数组的一种查找方式。是利用(letf+right)/2 = mid的方式来对半缩短搜索范围的一种方法,一次查找,搜索的范围就会减半。相较于简单查找找寻一个target需要n步,则二分查找则最多只需查找log2n步。
2.具体实现方法一
点击查看代码
class Solution { public int search(int[] nums, int target) { int left = 0; int right = nums.length -1; while(left target){ right = mid - 1; }else{ left = mid + 1; } } return -1; }}
方法二
点击查看代码
class Solution { public int search(int[] nums, int target) { int left = 0; right = nums.length; while (left > 1); if (nums[mid] == target) return mid; else if (nums[mid] target) right = mid; } return -1; }}
3.要点总结1.关于length是否-1的问题
- length是否-1取决于区间是左闭右闭区间( [ ] ),还是左闭右开区间( [ ) ).当选取左闭右闭区间( [ ] )时,length则需要-1,因为搜索区间包含右边界值,即整个数组下标都能取到则length需要-1。如果是左闭右开区间( [ ) ),length则不需要-1,因为右边界值不包含在搜索区间内,右边界值的取值无意义。
2.关于循环条件letf是<=还是<的问题
- 当区间是左闭右闭区间( [ ] ),left则取<= right。当区间是左闭右开区间( [ ) )时,则不取= 。
3.关于赋值是赋mid的还是mid-1的问题
- 当区间是左闭右闭区间( [ ] )时,mid则需要-1,因为mid包含在有效值区间,已经排除。当区间是左闭右开区间( [ ) )时,mid则不需要-1,因为mid的值不包含在有效的搜索区间内,无需排除,所以无需-1。
二、移除元素
- 27.移除元素leetcode链接
1.方法概述方法一:快慢“指针”法
- 定义一个fast下标和slow下标,两下标同时从0下标处用来寻找需要删除的val值,fast搜索需要删除的val值,如果fast为需要删除的值则fast++,slow不动,当fast不是需要删除的val值时,证明该值是返回数组中需要的值,将fast的值赋给slow,然后slow++。当fast <数值长度时说明遍历完毕,返回slow下标即为新数组的大小值。
方法一:头尾“指针”交换法(自创)
- 定义一个头下标start和尾下标end,分别从数组的0下标处和末端下标处进行搜索需要删除的val值。目的是将前排纯在的val值移到数组内的最后。有四种情况,一是start对应值和end对应值相等则end–。二是start对应值和end对应值都不相等则start++。三是当satrt的对应值不是val而end的对应值是val的时候,end–,start++。最后当start的对应值等于val的时且end的值不等于val值时,进行数值交换。最终start对应值就是新数组的长度。
2.具体实现方法一
点击查看代码
class Solution { public int removeElement(int[] nums, int val) { int n = nums.length; int left = 0; for (int right = 0; right < n; right++) { if (nums[right] != val) { nums[left] = nums[right]; left++; } } return left; }}
方法二
点击查看代码
class Solution { public int removeElement(int[] nums, int val) { int start = 0; int end = nums.length-1; while(start <= end){ if(nums[start] == val && nums[end] != val ){ int tmp = nums[start]; nums[start] = nums[end]; nums[end] = tmp; start++; end--; } else if (nums[start] != val && nums[end] == val ) { end--; start++; }else if(nums[start] != val && nums[end] != val ){ start++; }else{ end--; } } return start; } }
3.要点总结
- 首先需要明白的时数组的相关知识,如数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。然后重点是双指针的思想方法。
仅供个人参考,欢迎批评指正!