1. 坐标系找点
描述:
P为二维坐标系中整数点集。定义P中某点x,如果x满足P中的任一点都不在x的右上方,称为“最大点”。找到所有的最大点。
输入:
5
1 2
5 3
4 6
7 5
9 0
输出:(按x从小到大)
4 6
7 5
9 0
解法一:遍历每个点,若符合则取出。
import java.util.ArrayList;
import java.util.Scanner;
public class Main1
{
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
int[] xs=new int[n];
int[] ys=new int[n];
for(int i=0;i<n;i++){
xs[i]=scanner.nextInt();
ys[i]=scanner.nextInt();
}
for(int i=1;i<xs.length;i++){
for(int j=0;j<xs.length-i;j++){
if(xs[j+1]<xs[j]){
int xt=xs[j];
int yt=ys[j];
xs[j]=xs[j+1];
xs[j+1]=xt;
ys[j]=ys[j+1];
ys[j+1]=yt;
}
}
}
maxPoint(xs, ys);
}
public static void maxPoint(int[] xs,int[] ys){
ArrayList<Integer> listX=new ArrayList<Integer>();
ArrayList<Integer> listY=new ArrayList<Integer>();
for(int i=0;i<xs.length;i++){
int x=xs[i];
int y=ys[i];//第i个点的坐标
for(int j=0;j<xs.length ;j++){ //去掉第i个点
if(xs[j]>x && ys[j]>y){
break;
}
if(j==xs.length-1){
listX.add(x);
listY.add(y);
}
}
}
for (int i = 0; i < listX.size(); i++) {
System.out.println(listX.get(i)+" "+listY.get(i));
}
}
}
解法二:解法一中判断条件的改写。
public static void maxPoint(int[] xs,int[] ys){
ArrayList<Integer> listX=new ArrayList<Integer>();
ArrayList<Integer> listY=new ArrayList<Integer>();
for(int i=0;i<xs.length;i++){
int x=xs[i];
int y=ys[i];//第i个点的坐标
boolean flag=true;//设标识,为true的时候才要这个点
for(int j=0;j<xs.length ;j++){ //去掉第i个点
if(xs[j]>x && ys[j]>y){
flag=false;
break;
}
}
if(flag){ //注意:这个flag的在第一层for里,第二层for外
listX.add(x);
listY.add(y);
}
}
for (int i = 0; i < listX.size(); i++) {
System.out.println(listX.get(i)+" "+listY.get(i));
}
}
2.区间乘积最大值
解法:如果固定区间滑动,不好找到和前次的关系。固定一个点,区间增长,可用到前次的值。
import java.util.*;
public class Main1 {
public static void main(String [] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.nextLine();
String [] nums_str = sc.nextLine().split(" ");
int nums [] = new int[n];
for(int i = 0; i < n; i++) {
nums[i] = Integer.parseInt(nums_str[i]);
}
}
public static int areaMax(int[] nums){
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
int sum=0;
for(int start = 0; start < n; start++) { //1.表示起始位置
//外循环每次初始化,不记录以前的值。
min = nums[start];
sum=0;
for(int end = start; end < n; end++) {//2.end表示结束位置
min = Math.min(nums[end],min); // 找到最小值
sum+=nums[end]; //获得区间和
max=Math.max(max,min *sum); //获得乘积最小值
}
}
return max;
}
}