今日头条2017内推

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;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值