reuse array for product
This commit is contained in:
parent
34db36cf0b
commit
06b15921fd
1 changed files with 22 additions and 19 deletions
|
@ -8,29 +8,29 @@ enum Zeros {
|
||||||
|
|
||||||
impl Solution {
|
impl Solution {
|
||||||
pub fn product_except_self(nums: Vec<i32>) -> Vec<i32> {
|
pub fn product_except_self(nums: Vec<i32>) -> Vec<i32> {
|
||||||
let mut out = vec![0i32; nums.len()];
|
let mut out = nums;
|
||||||
let nums = nums.as_slice();
|
let nums = &mut out;
|
||||||
let zeros = count_zeros(nums);
|
let zeros = count_zeros(nums);
|
||||||
|
|
||||||
match zeros {
|
match zeros {
|
||||||
Zeros::None => {
|
Zeros::None => {
|
||||||
let prod: i32 = nums.iter().product();
|
let prod: i32 = nums.iter().product();
|
||||||
for (i, x) in nums.iter().enumerate() {
|
for x in nums.iter_mut() {
|
||||||
out[i] = prod / x;
|
*x = prod / *x;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Zeros::One(z) => {
|
Zeros::One(z) => {
|
||||||
let left = if z == 0 {
|
let (left, right) = nums.split_at(z);
|
||||||
1
|
let left = if z == 0 { 1 } else { left.iter().product() };
|
||||||
} else {
|
|
||||||
nums[0..z].iter().product()
|
|
||||||
};
|
|
||||||
let right = if z == nums.len() - 1 {
|
let right = if z == nums.len() - 1 {
|
||||||
1
|
1
|
||||||
} else {
|
} else {
|
||||||
nums[(z + 1)..].iter().product()
|
right[1..].iter().product()
|
||||||
};
|
};
|
||||||
out[z] = left * right;
|
for x in nums.iter_mut() {
|
||||||
|
*x = 0;
|
||||||
|
}
|
||||||
|
nums[z] = left * right;
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
|
@ -39,19 +39,22 @@ impl Solution {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn count_zeros(nums: &[i32]) -> Zeros {
|
fn count_zeros(nums: &[i32]) -> Zeros {
|
||||||
let mut zeros = std::collections::HashSet::new();
|
let mut out = Zeros::None;
|
||||||
|
let zs = 0;
|
||||||
for (i, n) in nums.iter().enumerate() {
|
for (i, n) in nums.iter().enumerate() {
|
||||||
if *n == 0i32 {
|
if *n == 0i32 {
|
||||||
zeros.insert(i);
|
if zs == 0 {
|
||||||
|
out = Zeros::One(i);
|
||||||
|
} else {
|
||||||
|
out = Zeros::Many;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
match zeros.len() {
|
|
||||||
0 => Zeros::None,
|
|
||||||
1 => Zeros::One(*zeros.iter().next().unwrap()),
|
|
||||||
_ => Zeros::Many,
|
|
||||||
}
|
}
|
||||||
|
out
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
println!("Hello, world!");
|
let p = Solution::product_except_self(vec![-1, 1, 0, -3, 3]);
|
||||||
|
dbg!(p);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue