第238题:除自身以外数组的乘积

一. 问题描述

给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。

示例:

输入: [1,2,3,4]

输出: [24,12,8,6]

说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。

进阶:

你可以在常数空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组不被视为额外空间)

二. 解题思路

本题思路:本题采用双指针的方式进行求解,由于题目要求请不要使用除法,且在 O(n) 时间复杂度内完成此题,所以我们应考虑到常数次的遍历,采用左右指针的方法进行求解。

步骤一:创建两个长度为n初始化为1的数组fir和sec。

步骤二:创建左右指针,分别从第二个数和倒数第二个数进行遍历,

fir[j]=fir[j-1]*nums[j-1];

sec[m]=sec[m+1]*nums[m+1];

步骤三:将两个数组对应数组相乘,输出最终数组。

三. 执行结果

执行用时 :1 ms, 在所有 java 提交中击败了100.00%的用户

内存消耗 :43.2 MB, 在所有 java 提交中击败了96.20%的用户

四. Java代码

class Solution {
    public int[] productExceptSelf(int[] nums) {
         int []fir=new int[nums.length];
        int []sec=new int[nums.length];
        for(int i=0;i<nums.length;i++) {
            fir[i]=1;
            sec[i]=1;
        }
        for(int j=1,m=nums.length-2;j<nums.length&&m>=0;j++,m--) {
            fir[j]=fir[j-1]*nums[j-1];
            sec[m]=sec[m+1]*nums[m+1];
        }
        for(int k=0;k<nums.length;k++) {
            fir[k]=fir[k]*sec[k];
        }
        return fir;
    }
}

原文地址:https://www.cnblogs.com/xiaobaidashu/p/12093297.html

时间: 2024-11-06 07:17:11

第238题:除自身以外数组的乘积的相关文章

编程题:用一组数组做函数参数来实现,输入两个数,输出其中最大数

#include<stdio.h> float max(float x,float y) { float z; if(x>y)z=x; else z=y; return z; } void main() { float a[2],c; scanf("%f,%f",&a[0],&a[1]); c=max(a[0],a[1]); printf("%f,%f,the max is %f\n",a[0],a[1],c); } 编程题:用一组

编程题:结构体数组的引用。功能:输出结构体数组各元素的成员值

编程题:结构体数组的引用.功能:输出结构体数组各元素的成员值 #include<stdio.h> void main() { struct person { char name[20]; char sex; int age; float height; }per[3]={{"Li Ping",'M',20,175},{"Wang Ling",'F',19,162.5}, {"Zhao Hui",'M',20,178}}; int i;

编程题:比较指向数组元素的指针变量和指向数组的指针变量的不同。

#include<stdio.h> void main() {int a[2][3]={1,2,3,4,5,6}; int *p1,(*p2)[3]; /*p1指向数组元素,p2指向包含3个元素的一维数组*/ p1=a[0];p2=a; /*用指向数组元素的指针变量输出二维数组元素*/ for(;p1<a[0]+6;p1++) printf("%4d",*p1); printf("\n"); /*用指向以为数组的指针变量输出二维数组元素*/ for

编程题:指针输出数组的灵活性。功能:输出数组中全部元素

#include<stdio.h> void main() { int *p,i; int a[5]={1,2,3,4,5}; p=a; printf("\n"); for(;p<a+5;p++) printf("%d\t",*p); } 编程题:指针输出数组的灵活性.功能:输出数组中全部元素,布布扣,bubuko.com

编程题:二维数组的下标意义

#include<stdio.h> void main() { int i,j,a[2][3],b[2][3]; for(i=0;i<2;i++) for(j=0;j<3;j++) a[i][j]=i; for(i=0;i<2;i++) for(j=0;j<3;j++) b[i][j]=j; printf("array a:\n"); for(i=0;i<2;i++) { for(j=0;j<3;j++) printf("%3d

编程题:实现一维数组初始化的几种形式。

#include<stdio.h> void main() { int n; int a[5]={0,1,2,3,4}; int b[5]={1,2}; float c[]={1,2,3,4,5}; for(n=0;n<5;n++) printf("%5d",a[n]); printf("\n"); for(n=0;n<5;n++) printf("%5d",b[n]); printf("\n"); f

第11题:移除数组中的重复元素

/* 前几天去爬泰山了,一直没更新,上山时还没什么感觉,下山后简直要崩溃啊,骨头都散了,继续更新...... */ 第11题:移除数组中的重复元素 给定一个升序排列的数组,去掉重复的数,并返回新的数组的长度. 例如: 数组A = {1, 1, 2},你的函数应该返回长度2,新数组为{1, 2} 要求: 不能新开数组分配额外的空间.即常数空间限制. 提示: 输入一个整数n,以及其对应的数组A[n],输出新数组长度 样例输入 5 0 0 1 1 2 样例输出 3 解析: #include <stdi

平面图形题(二维数组)

1 package tuxing; 2 3 4 //平面图形题(二维数组) 5 6 7 public class tuxing1 { 8 public static void main(String[] args) 9 { 10 11 12 int arr[][]=new int[3][9]; 13 int x=2; 14 int y=0; 15 boolean order=false; 16 for(int i=1;i<=9;i++) 17 { 18 arr[x][y]=i; 19 y++;

一道小题:从一个数组里产生所有可能的乘积组合

比如给定一个数组[2,3,11] 要求产生[1,2,3,6,11,22,33,66] 观察可得:[2,3] 产生了[1,2,3,6] 的乘积可能.当加入11时,11会和现有的每一个元素都相乘得到[1,2,3,6,11,22,33,66] public static void allProducts(int[] arr) { List<Integer> list = new ArrayList<Integer>(); list.add(1); for(int i=0; i<ar

剑指 offer 第一题: 二维数组中的查找

打算写 图解剑指 offer 66 题 的系列文章,不知道大家有没有兴趣 ?? 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 题目分析 图 1 如果没有头绪的话,很显然使用 暴力解法 是完全可以解决该问题的. 即遍历二维数组中的每一个元素,时间复杂度:O(n^2). 其实到这里我们就可以发现,使用这种暴力解法并没有充分利用题目给出的信息.这