迭代
- 将数组下标与数组内容对应起来
- 比较nums[i]和i,交换nums[i]和nums[nums[i]]
二分查找
排序数组中的搜索问题,首先想到 二分法 解决
二分查找汇总
剑指 Offer 53 - II. 0~n-1中缺失的数字
二分查找数组中是否有某节点 704 没有返回插入位置35
- while(left<=right) //left=right的时候继续循环,此时mid=left=right,此时仍进行循环
循环结束的条件是(left>right)- 插入位置应该时靠后边的那个节点,所以应该是return left(循环结束的条件)
- nums[mid]>/<target的时候更新left,right
- 相等 两个子函数判断是不是第一个和最后一个
第一个(nums[mid-1]!=target || mid== 0 )
最后有一个(nums[mid+1]!=target || mid==size-1)
- nums[mid]和nums[right]比较,条件left<right 看他是在前边(mid>right)那个部分还是 后边那个部分(mid>right)= 直接返回,更新left或者right的值,
- 找特定值的时候,先看是否相等,然后利用上边的判断哪边是有序的,还要去看target是否处于有序数组,否则去无序里面找
剑指 Offer 53 - I. 在排序数组中查找数字 I
剑指Offer(三十二):把数组排成最小的数
剑指Offer(五十一):构建乘积数组
- Arrays.sort(nums);排序函数
- 哈希
双指针
- 双指针:考虑定义双指针 i , j 分列数组左右两端,循环执行:
指针 i从左向右寻找偶数;
指针 j 从右向左寻找奇数;
将 偶数 nums[i]和 奇数 nums[j] 交换。- 两个队列
- 快慢指针 (赋值前边的非0元素)
- 后边剩的元素直接赋0
- 双指针法、暴力法
- 移除特定值:只是把nums[j]当成了一个容器,ij都从0开始,不等于就放进去,否则i就继续找
- 移除重复元素,
- 之前那个i、j从两头搜的方法,是针对有序数组的,所以不行,这个就是从头两个指针,一次遍历就好了
- 新建数组:int[] index=new int[2];
递归
- 先整体旋转(0,n-1)
- 然后旋转前边和后边(0,k-1)(k,n-1)
快排
- Arrays.copyOf(原数组,新数组长度)
- 跟找出第k个一样,只不过gettop,返回int[]
- 快排、找出topk
矩阵(回溯?)
- 从二维数组的右上角开始查找。如果当前元素等于目标值,则返回 true。如果当前元素大于目标值,则移到左边一列。如果当前元素小于目标值,则移到下边一行。
- 利用rows、row、cols、col matrix.length == 0 || matrix[0].length == 0
- 按层打印,定义top,bottom,left、right(matric.length matric[0].length)、数组data,数组下标index
- 条件left<right,bottom<top,更改四个位置变量,固定某行列的位置进行打印
- top的在矩阵中的下标是从0开始,bottom相反