• [leetcode]Two Sum


    本来以为是一道水题,结果居然能从n^2, n*log(n)一直优化到n。感慨啊~

    O(n^2): 暴力

    public class Solution {
        public int[] twoSum(int[] numbers, int target) {
            // Start typing your Java solution below
            // DO NOT write main() function
        	int[] r = new int[2];
            for (int i = 0; i < numbers.length; i++)
            {
            	for (int j = i+1; j < numbers.length; j++)
            	{
            		if (numbers[i] + numbers[j] == target)
            		{
            			r[0] = i+1;
            			r[1] = j+1;
            			break;
            		}
            	}
            }
            return r;
        }
    }
    

    O(n*log(n)): 排序。用了O(n)的空间记录原来的数组,然后开始和最后O(n)的扫一遍,不过不改变总体复杂度。当然有的人用数据结构记录原来的和后来的联系,那也就是另外O(n)的空间省最后扫一遍而已。解题过程中一开始忘了记录原来的数组,后来忘了排序后的第一第二和排序后的也可能不同。

    import java.util.Arrays;
    
    public class Solution {
        public int[] twoSum(int[] numbers, int target) {
            // Start typing your Java solution below
            // DO NOT write main() function
            int[] result = new int[2];
        	int[] tmp = new int[numbers.length];
        	for (int i = 0; i < numbers.length; i++)
        	{
        		tmp[i] = numbers[i];
        	}
            Arrays.sort(tmp);
            int l = 0;
            int r = tmp.length - 1;
            int sum = tmp[l] + tmp[r];
            while( sum != target && r > l)
            {
            	if (sum > target)
            	{
            		r--;
            	}
            	else
            	{
            		l++;
            	}
            	sum = tmp[l] + tmp[r];
            }
            int index = 0;
            for (int i = 0; i < numbers.length; i++)
            {
            	if (tmp[l] == numbers[i] || tmp[r] == numbers[i])
            	{
            		result[index] = i + 1;
            		index++;
            		if (index > 1) break;
            	}
            }
            
            return result;
        }
    }
    

     O(n): 果然无耻的用了Hash,那么也就不神奇了。所以真实的复杂度考虑到Hash的实现,会比O(n)要大些。

    import java.util.HashMap;
    
    public class Solution {
        public int[] twoSum(int[] numbers, int target) {
            // Start typing your Java solution below
            // DO NOT write main() function
            int[] result = new int[2];
        	HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
        	for (int i = 0; i < numbers.length; i++)
        	{
        		if (map.containsKey(target - numbers[i]))
        		{
        			result[0] = map.get(target-numbers[i]) + 1;
        			result[1] = i + 1;
        			break;
        		}
        		else
        		{
        			map.put(numbers[i], i);
        		}
        	}
            
            return result;
        }
    }
    

      

  • 相关阅读:
    python正则表达式re模块
    链表算法题之中等级别,debug调试更简单
    链表算法题二,还原题目,用debug调试搞懂每一道题
    开启算法之路,还原题目,用debug调试搞懂每一道题
    K8S线上集群排查,实测排查Node节点NotReady异常状态
    手写单链表基础之增,删,查!附赠一道链表题
    kafka初识
    docker之mysql镜像使用
    CS61B sp2018笔记 | Lists
    JSONArray.fromObject不执行且不报错问题的解决
  • 原文地址:https://www.cnblogs.com/lautsie/p/3178980.html
Copyright © 2020-2023  润新知