算法-给定无序数组和一个值

找出无序数组中的两个数的和为这个值的元素,不能使用额外的空间复杂度(不要使用HashMap)
不使用hashMap的做法,那么就使用两个for循环的方式,这样做的时间复杂度是O(N2)

    public static void twoElementSum(int[] array, int element) {
        for (int i=0;i<array.length;i++) {
            for (int j=i+1;j<array.length;j++) {
                if (array[i] + array[j] == element) {
                    System.out.println("第一个元素的位置:" + (i + 1) + ",第一个元素为" +array[i]);
                    System.out.println("第二个元素的位置:" + (j + 1) + ",第二个元素为" +array[j]);
                }
            }
        }
    }

采用hashMap集合的方式,首先将数组的value和其下标分别作为Map集合的key和value,然后遍历整个Map,使用两个值做差,得到另一个key,再通过map集合找到另一个key在数组中的下标。
这样做,因为hash查找的时间复杂度是O(1),所以整体的时间复杂度是O(N)

    // 找到这两个数的下标并返回(以长度为2的数组的形式返回)
    private static int[] getIndex(int[] arr, int num) {
        int[] ret = new int[2];
        HashMap<Integer, Integer> hashMap = new HashMap<>();
        int index = 0;

        // 将每个数字和其下标放进map中
        for (Integer curr : arr) {
            hashMap.put(curr, index++);
        }

        // 遍历HashMap并判断
        for (Map.Entry<Integer, Integer> entry : hashMap.entrySet()) {
            // 获取map的key,也就是数组中的value
            int value = entry.getKey();
            // 通过需要得到的值和获取的key做减法,得到另一个key,也就是数组中的另一个value
            int subValue = num - value;
            if (hashMap.containsKey(subValue)) {
                // 找到啦!
                ret[0] = entry.getValue();
                ret[1] = hashMap.get(subValue);
                if (ret[0] < ret[1])
                System.out.println("index of two numbers R:" + ret[0] + " " + ret[1]);
//                break;
            }
        }
        return ret;
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。