classSolution{
publicintminArray(int[] numbers){
int left =0, right = numbers.length-1;while(left < right){
int mid =(right + left)>>1;//也可以left+(right-left)>>1;if(numbers[mid]< numbers[right]){
right = mid;}elseif(numbers[mid]> numbers[right]){
left = mid +1;}else right -=1;//点睛之笔,右边一直往左,试着找最小,如果是找最大,应该向右走}return numbers[left];}}
classSolution{
publicint[]spiralOrder(int[][] matrix){
int m = matrix.length;if(m ==0)returnnewint[0];//二维数组要注意判断[],返回空数组new int[0]int n = matrix[0].length;int[] res =newint[m * n];int row =0, col =0, count =0;while(true){
for(int i = col; i < n; i++){
res[count++]= matrix[row][i];}if(m ==++row)break;for(int i = row; i < m; i++){
res[count++]= matrix[i][n-1];}if(--n == col)break;for(int i = n-1; i >= col; i--){
res[count++]= matrix[m-1][i];}if(--m == row)break;for(int i = m-1; i >= row; i--){
res[count++]= matrix[i][col];}if(n ==++col)break;}return res;}}
//最快//index存储的key是该位置元素最近一次出现的位置classSolution{
publicintlengthOfLongestSubstring(String s){
int n = s.length(), pre =0, max =0;int[] index =newint[128];Arrays.fill(index,-1);for(int i =0; i < n; i++){
if(index[s.charAt(i)]>= pre){
`在这里插入代码片`
pre = index[s.charAt(i)]+1;}
index[s.charAt(i)]= i;
max =Math.max(i-pre+1, max);}return max;}}
知识点总结
40 最小的k个数
难度
重点度
知识点
掌握度
链接
简单
快速排序、堆
题目描述: 输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
示例
输入:arr =[3,2,1], k =2
输出:[1,2] 或者 [2,1]
解答
//时间快//快速排序classSolution{
publicint[]getLeastNumbers(int[] arr,int k){
int n = arr.length;if(n==k)return arr;if(n < k || k <=0|| n==0)returnnewint[0];int l =0, r = n-1;int index =partition(arr, l, r);while(index != k-1){
if(index > k-1) r = index -1;else l = index +1;
index =partition(arr, l, r);}returnArrays.copyOfRange(arr,0,k);//注意一:返回数组的一部分}privateintpartition(int[] arr,int l,int r){
int mid = l +(r-l)/2;if(arr[l]> arr[r])swap(arr, l, r);if(arr[mid]> arr[r])swap(arr, mid, r);if(arr[mid]> arr[l])swap(arr, l, mid);int key = arr[l];//注意二:把中间大小的数作为key,且在队头while(l < r){
while(l < r && arr[r]>= key) r--;//注意三:这里有=
arr[l]= arr[r];while(l < r && arr[l]<= key) l++;
arr[r]= arr[l];}
arr[l]= key;return l;}privatevoidswap(int[] arr,int a,int b){
int temp = arr[a];
arr[a]= arr[b];
arr[b]= temp;}}//堆的时间复杂度较高,多次排序//JAVA也有最大堆,最小堆(队头在最前面,因为队列只能访问队头,所以找到最小数中的最大数,就要把最大数放在队头,即最大堆)//最小堆PriorityQueue<Integer> queue = new PriorityQueue<Integer>(),从小到大排序//最大堆PriorityQueue<Integer> queue = new PriorityQueue<Integer>((a,b)->b-a)//默认是小于零,a<b,反过来就是b-a<0,从大到小排序classSolution{
publicint[]getLeastNumbers(int[] arr,int k){
int n = arr.length;if(n==k)return arr;if(n < k || k <=0|| n==0)returnnewint[0];int[] res =newint[k];PriorityQueue<Integer> queue =newPriorityQueue<