LeetCode(中等)除自身以外数组的乘积(c#)

题目为给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。
示例:

输入: [1,2,3,4]
输出: [24,12,8,6]
提示:题目数据保证数组之中任意元素的全部前缀元素和后缀(甚至是整个数组)的乘积都在 32 位整数范围内。
说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。

第一个解法是时间复杂度是O(n^2)
直接暴力算法,for循环两遍

        public int[] ProductExceptSelf1(int[] nums)
        {
            int[] res = new int[nums.Count()];
            for (int i = 0; i < nums.Count(); i++)
            {
                int Temp = 1;
                for (int j = 0; j < nums.Count(); j++)
                {
                    if (i==j)
                    {
                        continue;
                    }
                    Temp *= nums[j];
                }
                res[i] = Temp;
            }
            return res;
        }

第二种算法是参考了题解,发现了一个规律,下面是我参考答案里的写的
一个数组[a,b,c,d]
新建数组left,遍历依次赋值,[1,a,ab,abc]
然后反向循环数组right,遍历赋值,注意是反向的,先给数组最后一个赋值为1, [0,0,0,1]→[0,0,d,1]
→[0,dc,d,1]→[bdc,dc,d,1]
直接将对应数组相乘,也就是left[0]right[0],就可以得到第一位乘积结果。
对应a0
a0是结果数组的第一个值,之后也是对应相乘就可以了。
根据这个题解,写出了C#代码。
这个自己想确实不好想到,但写完一次,就理解了这种思路,很不错。

public int[] ProductExceptSelf(int[] nums)
        {
            int[] resleft = new int[nums.Count()];
            int[] resright = new int[nums.Count()];
            int[] resFin = new int[nums.Count()];
            int left = 1;
            int right = 1;
            for (int i = 0; i < nums.Count(); i++)
            {
                resleft[i] = left;
                left *= nums[i];
            }
            for (int j = nums.Count()-1; j >=0 ; j--)
            {
                resright[j] = right;
                right *= nums[j];
                resFin[j] = resright[j] * resleft[j];
            }
            return resFin;
        }

你可能感兴趣的:(LeetCode,算法,leetcode,c#)