1、 排序数组中找和因子
1、问题
2、思路
(1)可以从第一个开始,确定两个指针,两层循环进行找,复杂度较高
(2)类似二分查找,两个指针定在左右,定右指针,左指针主键向后移动,左右指针相加
(3) 和<k,左指针向后移动;=k输出,左指针向右移动(不动右指针,可能有两个数相等);>k右指针向左移动
2、需要排序的子数组
1、问题
2、代码
package com.lanqiao.vidio;
public class SortArray {
public static void main(String[] args) {
}
public int[] find(int[] arr,int n)
{
int p1 = -1;
int p2 = -1;
int max = arr[0];
for(int i=0;i<n;i++)//从第一个数开始找拐点
{
if(i<n-1&&arr[i]>arr[i+1]&&p1==-1)//找到第一个拐点,注意条件
{
p1=i;
if(arr[i]>max)//记录当前波峰最大值,和下一个波做比较
max = arr[i];
}
if(arr[i]<max)//出现第二个波
p2=i;
}
if(p1==-1)//一直没有出现拐点
{
return new int[] {0,0};
}
return new int[] {p1,p2};
}
}
3、思路
(1)数组的情况类似于锯齿状,出现波峰或波谷时即出现了要排序的数组
(2)找波峰波谷的方法就是拐点的判断条件中的几点
3、topK问题
1、问题
在一个数组中,输入一些数字,每次输入一个,最终输出结果中最大的几个数字
2、代码
package com.lanqiao.vidio;
import java.util.Scanner;
public class TopK {
static int k=10;
public static void main(String[] args) {
int[] arr = {1,3,5,7,9};
int m;
Scanner sc = new Scanner(System.in);
while((m=sc.nextInt())!=-1)
{
top(arr,m);
for(int i:arr)
{
System.out.print(i+" ");
}
}
}
public static void top(int[] arr,int k)
{
int min = arr[0];
int j = 0;
for(int i = 0;i<arr.length;i++)
{
if(arr[i]<min)
{
min = arr[i];
j=i;
}
}
if(k>min)
{
arr[j]=k;
}
}
}
4、数组能排成的最小数
1、问题
2、代码
package com.lanqiao.vidio;
import java.util.Arrays;
import java.util.Comparator;
public class MinArray {
public static void main(String[] args) {
Integer[] arr = {32,33,321};
System.out.println(f(arr));
}
public static int f(Integer[] arr)
{
Arrays.sort(arr,new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
String s1 = o1+""+o2;
String s2 = o2+""+o1;
return s1.compareTo(s2);
}
});
StringBuilder sb = new StringBuilder();
for(int i=0;i<arr.length;i++)
sb.append(arr[i]);
return Integer.parseInt(sb.toString());
}
}
3、思想
(1)修改Sort排序原则根据字符串大小进行比较(思想)
(2)比较排序完成之后使用StringBuilder()进行拼接:StringBuilder可以拼接int类型
(3)拼接完成之后,使用ParseInt方法转换成int类型