【问题标题】:How to optimize this exercise from HackerEarth?如何从 HackerEarth 优化这个练习?
【发布时间】:2019-01-27 14:16:00
【问题描述】:

这是我在这里的第一个问题。所以我遇到了来自 HackerEarth 的 this 问题,我使用 HashMap 解决了它。
我认为我的解决方案是正确的,因为在所有 5 个输入中,有 3 个是正确的,但其余两个超过了时间限制。我该如何改进我的解决方案?
我的解决方案:

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;


class TestClass {
    public static void main(String args[] ) throws Exception {

        //Scanner
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int k = sc.nextInt();

        Map<Integer,Integer> map = new HashMap<>();
        for(int i=0;i<n;i++){
            int x=sc.nextInt();
            Integer value = map.get(x);
            if(value == null) {
                map.put(x, 1);
            }
            else if(value<=1) map.put(x,2);
        }

        for(Map.Entry<Integer,Integer> entry : map.entrySet()){
            Integer key = entry.getKey();
            if(map.containsKey(k-key)) {
                //check if same key
                if(k - key == key){
                    if(map.get(key)>1) {
                        System.out.println("YES");
                        return;
                    }
                }
                else {
                    System.out.println("YES");
                    return;
                }
            }
        }
        System.out.println("NO");

    }
}

我无法在此处发布输入示例,因为它们大于消息的正文限制......

【问题讨论】:

  • 我没有仔细阅读您的代码,但如果我正确理解了任务,您将获得 K 的值以及一个数组。因此,您为什么要使用地图?我将从迭代数组开始并检查所有以下元素。然后一种优化可能是首先对数组进行排序并使用二进制搜索方法来查找这些元组。
  • 不,抱歉,我尝试通过对元素进行排序来解决它,但计算成本太高了..
  • 你是如何排序的?
  • 好吧,基本上对数组进行排序是O(n*lgn),但他的方法是O(n)(好吧,如果我们在使用HashMaps时不考虑系数,则接近O(n) - 但是它们确实存在于现实中)
  • @Thomas 我认为没关系(即使使用最好的排序方法也会超过时间限制) - 但为了回答你的问题,我使用了快速排序

标签: java optimization hashmap


【解决方案1】:

您可以修改第一个 for 循环,使其不包含所有数字,仅包含小于 k 的数字(为什么?因为您的所有数字都是正数,因此您无法获得 k其中一个数字大于或等于k)
旧代码:

for(int i=0;i<n;i++){
            int x=sc.nextInt();
            Integer value = map.get(x);
            if(value == null) {
                map.put(x, 1);
            }
            else if(value<=1) map.put(x,2);
        }

修改版:

for(int i=0;i<n;i++){
            int x=sc.nextInt();
            Integer value = map.get(x);
            if(x < k){
                if(value == null) {
                    map.put(x, 1);
                }
                else if(value<=1) map.put(x,2);
            }
        }

完整解决方案:

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;


class TestClass {
    public static void main(String args[] ) throws Exception {

        //Scanner
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int k = sc.nextInt();

        Map<Integer,Integer> map = new HashMap<>();
        for(int i=0;i<n;i++){
            int x=sc.nextInt();
            Integer value = map.get(x);
            if(x < k){
                if(value == null) {
                    map.put(x, 1);
                }
                else if(value<=1) map.put(x,2);
            }
        }
        ;
        for(Map.Entry<Integer,Integer> entry : map.entrySet()){
            Integer key = entry.getKey();
            if(k>=key && map.containsKey(k-key)) {
                //check if same key
                if(k - key == key){
                    if(map.get(key)>1) {
                        System.out.println("YES");
                        return;
                    }
                }
                else {
                    System.out.println("YES");
                    return;
                }
            }
        }
        System.out.println("NO");

    }
}

【讨论】:

  • 哈哈。我不相信。现在可以了。而且不超过时限。
  • 我查看了输入文件,其中有很多大于k的数字,所以我将它们全部添加到HasHap中,这就是它超过时间的原因
猜你喜欢
  • 2020-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多