• LeetCode 238. Product of Array Except Self


    原题链接在这里:https://leetcode.com/problems/product-of-array-except-self/description/

    题目:

    Given an array of n integers where n > 1, nums, return an array output such that output[i] is equal to the product of all the elements of nums except nums[i].

    Solve it without division and in O(n).

    For example, given [1,2,3,4], return [24,12,8,6].

    Follow up:
    Could you solve it with constant space complexity? (Note: The output array does not count as extra space for the purpose of space complexity analysis.)

    题解:

    看到这道题内心十分憎恨自己,这道题在Amazon电面中遇到,当时没有刷题,没有想到这种方法,若是当时刷了题该多好.

    leftArr rightArr的方法早已知晓. follow-up 里说不用额外空间,可以采用res数组间接保留leftArr 和 rightArr 数组. 

    两遍iteration, 第一遍更新左侧, res[i] = left; 第二遍更新右侧, res[i] *= right. 注意一边是是等于,一边是乘等于.

    Note: 该i--时不要顺手写成i++.

    Method 1 Time Complexity: O(n). Space: O(1).

    Method 2 Time Complexity: O(n). Space: O(n), res size.

    AC Java:

     1 public class Solution {
     2     public int[] productExceptSelf(int[] nums) {
     3         //Method 1
     4         /*
     5         if(nums == null || nums.length == 0){
     6             return nums;
     7         }
     8         int [] index = new int[2];
     9         Arrays.fill(index,-1);
    10         int product = 1;
    11         
    12         for(int i = 0; i<nums.length; i++){
    13             product *= nums[i];
    14             if(nums[i] == 0 && index[0] == -1){
    15                 index[0] = i;
    16             }else if(nums[i] == 0 && index[1] == -1){
    17                 index[1] = i;
    18             }
    19         }
    20         if(index[0] == -1){
    21             for(int i = 0; i<nums.length; i++){
    22                 nums[i] = product/nums[i];
    23             }
    24         }else if(index[1] == -1){
    25             int po = 1;
    26             for(int i = 0; i<nums.length; i++){
    27                 if(i != index[0]){
    28                     po*=nums[i];
    29                 }
    30             }
    31             Arrays.fill(nums,0);
    32             nums[index[0]] = po;
    33         }else{
    34             Arrays.fill(nums,0);
    35         }
    36         
    37         return nums;
    38         */
    39         
    40         //Method 2
    41         if(nums == null || nums.length == 0){
    42             return nums;
    43         }
    44         int [] res = new int[nums.length];
    45         int left = 1;
    46         int right = 1;
    47         for(int i = 0; i<nums.length; i++){
    48             res[i] = left;
    49             left *=nums[i];
    50         }
    51         for(int i = nums.length-1; i>=0; i--){
    52             res[i] *=right;
    53             right *=nums[i];
    54         }
    55         return res;
    56     }
    57 }
  • 相关阅读:
    VMwareTools安装笔记
    Oracle常用命令(持续更新)
    window常用命令(持续更新)
    Oracle 中 sys和system帐号的区别
    决策树——排序算法的理论下界
    插入、选择、冒泡、梳排序性能比较
    插入、选择、冒泡排序的综述
    绝知此事要躬行之——插入排序
    Tree 和ls 的使用
    用户目录
  • 原文地址:https://www.cnblogs.com/Dylan-Java-NYC/p/4881249.html
Copyright © 2020-2023  润新知