算法总结之 不包含本位置的累乘数组

给定一个整型数组arr,返回不包含本位置的乘数组

一般做法是用除法,新方法:

一个位置上 除去 自己值的累乘,就是自己左边的累乘再乘以自己右边的累乘,即 res[i]=lr[i-1]*rl[i+1]

最左的位置 和 最右的位置 比较特殊, 即 res[0]=rl[1] , res[N-1]=lr[N-2]

这样虽然可以得到结果,但是不好的是,用两个两个额外的数组,lr[]  rl[], 如何避免呢? 通过res数组复用的方式。

具体看代码吧:

package TT;

public class Test80 {

    public static int[] product(int[] arr){

          if(arr==null || arr.length<2){
                return null;
          }

          int[] res  = new int[arr.length];
          res[0]=arr[0];
          for (int i = 1; i < arr.length; i++) {

              res[i]=res[i-1]*arr[i];
        }
         int tmp = 1;
         for(int i = arr.length-1; i>0; i--){
             res[i]=res[i-1]*tmp;
             tmp*=arr[i];
         }
         res[0]=tmp;
         return res;
    }

    public static void main(String[] args){
        int[] arr = new int[4];
        arr[0]=2;
        arr[1]=3;
        arr[2]=1;
        arr[3]=4;

        int[] arr1 = product(arr);
        for(int i =0; i<arr.length; i++){
            System.out.println(arr1[i]);
        }

    }

}

时间: 2024-10-23 22:43:55

算法总结之 不包含本位置的累乘数组的相关文章

[算法]不包含本位置值的累乘数组

题目: 给定一个整型数组,返回不包含本位置的累乘数组. 例如:arr=[2,3,1,4],返回[12,8,24,6],即除自己外,其他位置的类乘. 要求: 1.时间复杂度为O(N). 2.除需要返回的结果数组之外,额外空间复杂度为O(1). 使用除法: 结果数组记为res,所有数的乘积记为all.如果数组中不含0,则设置res[i]=all/arr[i].如果数组中有一个0,对唯一的arr[i]==0的位置令res[i]=all,其他位置都是0.如果数组中0的数量大于1,那么res所有位置上的值

[算法]求一段包含所有种类的字符子串

有一个字符串首尾相连(m个字符),有n种字符组成,求一段能使包含n种字符的子串,并使长短最短,时间复杂度要求O(n),空间复杂度O(1) #include <cstring>int foo(const char* str, int m, int n){ int hit[256], count = 0, begin = 0, end, len = m; memset(hit,0,256*4); int j; for(j = 0; j < m && count < n;

《程序员代码面试指南》第八章 数组和矩阵问题 不包含本位置值的累乘数组

题目 不包含本位置值的累乘数组 java代码 package com.lizhouwei.chapter8; /** * @Description: 不包含本位置值的累乘数组 * @Author: lizhouwei * @CreateDate: 2018/5/9 21:11 * @Modify by: * @ModifyDate: */ public class Chapter8_22 { public int[] product(int[] arr) { int[] res = new in

笔试算法题(07):还原后序遍历数组 &amp; 半翻转英文句段

出题:输入一个整数数组,判断该数组是否符合一个二元查找树的后序遍历(给定整数数组,判定其是否满足某二元查找树的后序遍历): 分析:利用后序遍历对应到二元查找树的性质(序列最后一个元素必定是根节点,从左向右第一个比根节点大的元素开始直到根节点之前的所有元素必定在右子树,之前的所有元素必定在左子树): 解题: 1 bool PostOrderCheck(int *array, int i, int j) { 2 /** 3 * 如快速排序一样,解决小子文件 4 * */ 5 if(j-i+1 ==

Jquery 第一课(jq选择器:id、类、标签、奇偶、eq、nth-child、子元素、属性、包含、位置、过滤)

一.什么是jQuery? jQuery是一款比较优秀的js框架.是将js中比较常用的方法封装底层.口号是"write less,do more". 二.如何使用jQuery呢?(使用jQuery的整体思路) 1.页面加载完之后 2.找到对象 3.执行你要的事件 4.声明一个事件(function()) 5.完成事件里面的内容 三.第一个jQuery程序 注意小点:1.引入jQuery文件的时候,把jQuery的文件放js文件之前(页面由上而下执行). 2.$的作用 一个是页面加载 还有

第十课 课程重点(jq选择器:id、类、标签、奇偶、eq、nth-child、子元素、属性、包含、位置、过滤)

1.在VS中新建jq项目: 新建web窗体时选择第二个: 将系统生成的多余文件夹删掉,仅留下Scripts和Web.config: 将Scripts文件夹改名为我们熟悉的js(也可以不改,仅推荐改),并新建文件夹css和image,并在对应位置添加页面,html.css.js 将上图鼠标所指的.min.js文件拖动到html中,将自己新建的js文件拖动到它下方,如图: *两者上下位置关系千万别弄饭了,min.js一定要在最上面. 将Script文件夹中的第一个js文件(_references.j

2015.7.20 第十课 课程重点(jq选择器:id、类、标签、特殊、属性、包含、位置、过滤)

1.在VS中新建jq项目: 新建web窗体时选择第二个: 将系统生成的多余文件夹删掉,仅留下Scripts和Web.config: 将Scripts文件夹改名为我们熟悉的js(也可以不改,仅推荐改),并新建文件夹css和image,并在对应位置添加页面,html.css.js 将上图鼠标所指的.min.js文件拖动到html中,将自己新建的js文件拖动到它下方,如图: *两者上下位置关系千万别弄饭了,min.js一定要在最上面. 将Script文件夹中的第一个js文件(_references.j

算法Sedgewick第四版-第1章基础-1.4 Analysis of Algorithms-007按位置,找出数组相关最大值

Given an array a[] of N real numbers, design a linear-time algorithm to find the maximum value of a[j] - a[i] where j ≥ i. 1 package algorithms.analysis14; 2 3 public class Best { 4 5 public static void main(String[] args) { 6 double[] a = {5.0, 4.0,

数据结构与算法(刺猬书)读书笔记(1)----数组

在JavaScript中,数组其实是一种特殊的对象,用来表示偏移量的索引是该对象的属性,所以JavaScript的数组本质上是对象.同时这些数字索引在内部会被转换成为字符串类型,因为JavaScript对象中的属性名必须是字符串.此外,JavaScript数组还有一个特点,就是数组的每一项可以保存任何类型的数据,而且,数组的大小是可以动态调整的. 1. 创建数组 数组的创建方法有两种,第一种是简单的声明一个数组变量: var numbers = []; var numbers = [1, 2,