今日頭條2017內推
阿新 • • 發佈:2019-02-02
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;
}
}