LeetCode 1: 两数之和
⭕️ 解题思路:
对于本题是可以通过双层for循环暴力求解的,但时间复杂度为O(n^2),因为利用哈希表查找是最快的,所以此处通过哈希表来解题
(1)创建一个哈希表,遍历数组,如果哈希表中存在 target - nums[i],那么返回索引
(2)如果不存在,就将当前元素值与索引构造成键值对添加到哈希表中
(3)因为我们最后要的是两个索引值,所以将数组中元素的数值设置为哈希表的 Key,将元素的索引设置为 Key
❌ 关于哈希表的基础操作:
//创建哈希表
HashMap<Integer, String> map = new HashMap<Integer, String>();
//添加键值对
map.put(key, value);
//根据key查看value
map.get(key);
//根据key删除键值对
map.remove(key);
//查看哈希表中是否包含key的键值对
map.containsKey(key)
//判断哈希表是否为空
map.isEmpty();
//统计哈希表中键值对的数量
map.size();
//替换哈希表中的键值对
map.replace(key, value);
📖 代码部分:
class Solution {
public int[] twoSum(int[] nums, int target) {
//创建一个哈希表
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
//遍历数组
for(int i = 0; i < nums.length; i++){
int n = target - nums[i];
if(map.containsKey(n)){
return new int [] {map.get(n), i};
}
map.put(nums[i], i);
}
return new int[0];
}
}
LeetCode 15:三数之和
排序 + 双指针法
⭕️ 解题思路:
(1)创建一个集合[大集合里套小集合]
(2)利用Arrays.sort()
对数组进行排序,因为后面要用到这条性质
(3)遍历数组,如果数组的第一个元素大于零,说明数组没有满足条件的集合,如果当前数组元素的值与前一个值相同,那么直接调到下一次循环
(4)准备第二次循环,设置两个指针,左指针为当前元素的下一个元素,右指针指向数组元素的最后一个,将这三个数组元素的值加和,如果sum 大于零,那么将右指针左移,如果sum小于零,那么将左指针右移,否则就利用Arrays中的asList()
方法将数组中的元素转化为集合
(5)然后更新左右指针,如果左指针的下一个元素与当前元素相同,那么就一直将左指针右移,但要保证左指针小于右指针;对于右指针的处理方法与左指针相同。然后再将左指针向右移动一个位置,右指针向左移动一个位置
(6)最后返回创建的集合
代码部分:
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
//创建一个集合,集合的元素还是集合
List<List<Integer>> result = new ArrayList<>();
//将数组排序
Arrays.sort(nums);
//遍历数组
for(int i = 0; i < nums.length; i++){
//如果数组第一个元素大于零,那么就不会有三元组和为零
if(nums[0] > 0){
return result;
}
if(i > 0 && nums[i] == nums[i - 1]){
continue;
}
int left = i + 1;
int right = nums.length - 1;
while(left < right){
int sum = nums[i] + nums[left] + nums[right];
if(sum > 0){
right--;
}else if(sum < 0){
left++;
}else{
//说明找到了一组符合条件的三元组
result.add(Arrays.asList(nums[i], nums[left], nums[right]));
//避免出现重复的三元组
while(left < right && nums[left] == nums[left + 1]){
left++;
}
while(left < right && nums[right] == nums[right - 1]){
right--;
}
left++;
right--;
}
}
}
return result;
}
}