mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-09 19:44:45 +08:00
Merge pull request #1515 from cezarbbb/Hash01
添加 0202.快乐数 0015.三数之和 0018.四数之和 Rust版本
This commit is contained in:
@ -554,6 +554,71 @@ func threeSum(_ nums: [Int]) -> [[Int]] {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Rust:
|
||||||
|
```Rust
|
||||||
|
// 哈希解法
|
||||||
|
use std::collections::HashSet;
|
||||||
|
impl Solution {
|
||||||
|
pub fn three_sum(nums: Vec<i32>) -> Vec<Vec<i32>> {
|
||||||
|
let mut result: Vec<Vec<i32>> = Vec::new();
|
||||||
|
let mut nums = nums;
|
||||||
|
nums.sort();
|
||||||
|
let len = nums.len();
|
||||||
|
for i in 0..len {
|
||||||
|
if nums[i] > 0 { break; }
|
||||||
|
if i > 0 && nums[i] == nums[i - 1] { continue; }
|
||||||
|
let mut set = HashSet::new();
|
||||||
|
for j in (i + 1)..len {
|
||||||
|
if j > i + 2 && nums[j] == nums[j - 1] && nums[j] == nums[j - 2] { continue; }
|
||||||
|
let c = 0 - (nums[i] + nums[j]);
|
||||||
|
if set.contains(&c) {
|
||||||
|
result.push(vec![nums[i], nums[j], c]);
|
||||||
|
set.remove(&c);
|
||||||
|
} else { set.insert(nums[j]); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```Rust
|
||||||
|
// 双指针法
|
||||||
|
use std::collections::HashSet;
|
||||||
|
impl Solution {
|
||||||
|
pub fn three_sum(nums: Vec<i32>) -> Vec<Vec<i32>> {
|
||||||
|
let mut result: Vec<Vec<i32>> = Vec::new();
|
||||||
|
let mut nums = nums;
|
||||||
|
nums.sort();
|
||||||
|
let len = nums.len();
|
||||||
|
for i in 0..len {
|
||||||
|
if nums[i] > 0 { return result; }
|
||||||
|
if i > 0 && nums[i] == nums[i - 1] { continue; }
|
||||||
|
let (mut left, mut right) = (i + 1, len - 1);
|
||||||
|
while left < right {
|
||||||
|
if nums[i] + nums[left] + nums[right] > 0 {
|
||||||
|
right -= 1;
|
||||||
|
// 去重
|
||||||
|
while left < right && nums[right] == nums[right + 1] { right -= 1; }
|
||||||
|
} else if nums[i] + nums[left] + nums[right] < 0 {
|
||||||
|
left += 1;
|
||||||
|
// 去重
|
||||||
|
while left < right && nums[left] == nums[left - 1] { left += 1; }
|
||||||
|
} else {
|
||||||
|
result.push(vec![nums[i], nums[left], nums[right]]);
|
||||||
|
// 去重
|
||||||
|
right -= 1;
|
||||||
|
left += 1;
|
||||||
|
while left < right && nums[right] == nums[right + 1] { right -= 1; }
|
||||||
|
while left < right && nums[left] == nums[left - 1] { left += 1; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
C:
|
C:
|
||||||
```C
|
```C
|
||||||
//qsort辅助cmp函数
|
//qsort辅助cmp函数
|
||||||
|
@ -522,6 +522,51 @@ public class Solution
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Rust:
|
||||||
|
```Rust
|
||||||
|
impl Solution {
|
||||||
|
pub fn four_sum(nums: Vec<i32>, target: i32) -> Vec<Vec<i32>> {
|
||||||
|
let mut result: Vec<Vec<i32>> = Vec::new();
|
||||||
|
let mut nums = nums;
|
||||||
|
nums.sort();
|
||||||
|
let len = nums.len();
|
||||||
|
for k in 0..len {
|
||||||
|
// 剪枝
|
||||||
|
if nums[k] > target && (nums[k] > 0 || target > 0) { break; }
|
||||||
|
// 去重
|
||||||
|
if k > 0 && nums[k] == nums[k - 1] { continue; }
|
||||||
|
for i in (k + 1)..len {
|
||||||
|
// 剪枝
|
||||||
|
if nums[k] + nums[i] > target && (nums[k] + nums[i] >= 0 || target >= 0) { break; }
|
||||||
|
// 去重
|
||||||
|
if i > k + 1 && nums[i] == nums[i - 1] { continue; }
|
||||||
|
let (mut left, mut right) = (i + 1, len - 1);
|
||||||
|
while left < right {
|
||||||
|
if nums[k] + nums[i] > target - (nums[left] + nums[right]) {
|
||||||
|
right -= 1;
|
||||||
|
// 去重
|
||||||
|
while left < right && nums[right] == nums[right + 1] { right -= 1; }
|
||||||
|
} else if nums[k] + nums[i] < target - (nums[left] + nums[right]) {
|
||||||
|
left += 1;
|
||||||
|
// 去重
|
||||||
|
while left < right && nums[left] == nums[left - 1] { left += 1; }
|
||||||
|
} else {
|
||||||
|
result.push(vec![nums[k], nums[i], nums[left], nums[right]]);
|
||||||
|
// 去重
|
||||||
|
while left < right && nums[right] == nums[right - 1] { right -= 1; }
|
||||||
|
while left < right && nums[left] == nums[left + 1] { left += 1; }
|
||||||
|
left += 1;
|
||||||
|
right -= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
Scala:
|
Scala:
|
||||||
```scala
|
```scala
|
||||||
object Solution {
|
object Solution {
|
||||||
|
@ -315,6 +315,36 @@ class Solution {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Rust:
|
||||||
|
```Rust
|
||||||
|
use std::collections::HashSet;
|
||||||
|
impl Solution {
|
||||||
|
pub fn get_sum(mut n: i32) -> i32 {
|
||||||
|
let mut sum = 0;
|
||||||
|
while n > 0 {
|
||||||
|
sum += (n % 10) * (n % 10);
|
||||||
|
n /= 10;
|
||||||
|
}
|
||||||
|
sum
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn is_happy(n: i32) -> bool {
|
||||||
|
let mut n = n;
|
||||||
|
let mut set = HashSet::new();
|
||||||
|
loop {
|
||||||
|
let sum = Self::get_sum(n);
|
||||||
|
if sum == 1 {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if set.contains(&sum) {
|
||||||
|
return false;
|
||||||
|
} else { set.insert(sum); }
|
||||||
|
n = sum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
C:
|
C:
|
||||||
```C
|
```C
|
||||||
typedef struct HashNodeTag {
|
typedef struct HashNodeTag {
|
||||||
|
Reference in New Issue
Block a user