首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  算法

有大佬解释一下这代码什么原理吗

  •  
  •   stevenbipt · 2018-04-05 22:59:25 +08:00 · 1841 次点击
    这是一个创建于 437 天前的主题,其中的信息可能已经有所发展或是发生改变。

    刷 leetcode 时翻了一下以前刷的题发现一个神奇的代码,题目是 leetcode 第一题两数之和,本来以为用 hash 表做已经达到极限了,结果发现了一个更快的代码,由于个人能力有限分析不出全部代码的精明之处,求大佬们指点。 java 代码: class Solution { public int[] twoSum(int[] nums, int target) { int numMin = Integer.MAX_VALUE; int numMax = Integer.MIN_VALUE; for (int num : nums) { if (num < numMin) { numMin = num; }

        if (num > numMax) {
          numMax = num;
        }
      }  
      int max = target - numMin;
      int min = target - numMax;
    
      int targetMax = max > numMax ? numMax : max;
      int targetMin = min < numMin ? numMin : min;  
      int[] numIndices = new int[targetMax - targetMin + 1];
    
      for (int i = 0; i <= numIndices.length - 1; i++) {
        numIndices[i] = -1;
      }    
      for (int i = 0; i <= nums.length - 1; i++) {
        if (nums[i] >= targetMin && nums[i] <= targetMax) {
          int offset = -targetMin;
          if (numIndices[(target - nums[i]) + offset] != -1) {
            return new int[] { numIndices[(target - nums[i]) + offset], i };
          } else {
            numIndices[nums[i] + offset] = i;
          }
        }
      }
      return new int[] { 0, 0 };
    }
    

    }

    15 回复  |  直到 2018-04-06 08:07:43 +08:00
        1
    pandaaa   2018-04-05 23:04:23 +08:00 via Android   ♥ 1
    排版啊少年→_→
        2
    stevenbipt   2018-04-05 23:06:29 +08:00
    @pandaaa 没搞懂这个代码怎么排版出来的= =
        3
    stevenbipt   2018-04-05 23:07:31 +08:00
    class Solution {
    public int[] twoSum(int[] nums, int target) {

    int numMin = Integer.MAX_VALUE;
    int numMax = Integer.MIN_VALUE;
    for (int num : nums) {
    if (num < numMin) {
    numMin = num;
    }

    if (num > numMax) {
    numMax = num;
    }
    }
    int max = target - numMin;
    int min = target - numMax;

    int targetMax = max > numMax ? numMax : max;
    int targetMin = min < numMin ? numMin : min;

    int[] numIndices = new int[targetMax - targetMin + 1];

    for (int i = 0; i <= numIndices.length - 1; i++) {
    numIndices[i] = -1;
    }
    for (int i = 0; i <= nums.length - 1; i++) {
    if (nums[i] >= targetMin && nums[i] <= targetMax) {
    int offset = -targetMin;
    if (numIndices[(target - nums[i]) + offset] != -1) {
    return new int[] { numIndices[(target - nums[i]) + offset], i };
    } else {
    numIndices[nums[i] + offset] = i;
    }
    }
    }
    return new int[] { 0, 0 };
    }
    }
        4
    stevenbipt   2018-04-05 23:07:52 +08:00
    完啦更鬼畜了= =妈耶
        5
    lhx2008   2018-04-05 23:08:36 +08:00 via Android   ♥ 1
    这个代码现在直接提交会更快吗,历史的不算数的
        6
    stevenbipt   2018-04-05 23:09:31 +08:00
    @lhx2008 不会,就是 3ms,上次看到最快的是用 hash 表完成的( 6ms)
        7
    lcdtyph   2018-04-05 23:09:56 +08:00   ♥ 1
    这就是实现了一个哈希函数是 hash(x) -> x 的哈希表啊。
    而且这个代码在数据极差很大的时候肯定会 MLE
        8
    stevenbipt   2018-04-05 23:15:22 +08:00
    @lcdtyph 谢谢大佬指点(。・∀・)ノ゙
        9
    stevenbipt   2018-04-05 23:23:51 +08:00
    @lcdtyph 弱弱问大佬一句( mle 什么意思啊= =)
        10
    lcdtyph   2018-04-05 23:27:33 +08:00   ♥ 2
    @stevenbipt #9 MLE 是 memory limit error 就是内存超限,TLE 就是时间超限
        11
    stevenbipt   2018-04-05 23:30:47 +08:00 via Android
    @lcdtyph 谢谢大佬指点😚😚😚
        12
    lcdtyph   2018-04-05 23:56:01 +08:00 via iPhone
    @stevenbipt 啊…是 memory limit exceeded 抱歉
        13
    DeweyLiu   2018-04-06 00:56:57 +08:00 via Android
    @stevenbipt 哈希 好像 1ms 就搞定了
        14
    vegito2002   2018-04-06 01:15:50 +08:00 via iPad
    自己拿数组造轮子做 stack 做 map 的解法, 就是用来耍 OJ 玩的, 大概了解一下就行了, 真正面试的时候不会碰到这么蛋疼的公司的。
        15
    stevenbipt   2018-04-06 08:07:43 +08:00
    @DeweyLiu 貌似在 java 上最快就 3ms
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2393 人在线   最高记录 5043   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 19ms · UTC 00:41 · PVG 08:41 · LAX 17:41 · JFK 20:41
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1