学习目标:
本次学习目标为 力扣初级算法-数组,其中主要的LC如下:
- 移动零
- 两数之和
学习内容:
- 移动零-----(链接)
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例1:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
解题思路:
- 解法一: 把非零元素往前移动
- 边界问题:考虑数组为null 和空的情况
- 代码逻辑过程:
- 循环遍历入参数组元素,当元素不为零时,将元素直接重置到入参数组中
- 代码实现:
if (null == nums || 0 == nums.length ){
return;
}
int index = 0;
for (int i = 0; i < nums.length; i++){
if (nums[i] != 0){
nums[index++] = nums[i];
}
}
while (index < nums.length){
nums[index++] = 0;
}
- 解法二: 双指针发
- 边界问题:考虑数组为null 和空的情况
- 代码逻辑过程:
- 使用双指针,一个游标指针 j 用于循环数组的所有元素,其中再声明一个变量 i 用于存放出现 0 的个数,此时,将游标 j 减去 变量 i 得到的坐标作为第二个指针,第二个指针作为被替换的 元素坐标,同时再讲游标指针 j 赋值为 0
- 代码实现:
public void moveZeroes02(int[] nums) {
// 代表前面为0的个数
int i = 0;
for (int j = 0; j < nums.length; j++){
// 当元素为0时不处理
if (0 == nums[j]){
i ++;
// 当元素不为0时则按0的个数往前找
}else if (i != 0){
nums[j -i] =nums[j];
nums[j] = 0;
}
}
}
- 两数之和 (链接)
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。示例1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。示例2:
输入:nums = [3,2,4], target = 6
输出:[1,2]示例3:
输入:nums = [3,3], target = 6
输出:[0,1]进阶:你可以想出一个时间复杂度小于 O(n2) 的算法吗?
-
解法一:
-
边界问题:暴力破解
-
解题思路:
- 首先循环第一个入参数组A,在数组A的元素A1中,再次循环入参数组B,取元素Bn ,若两者符合,则直接return。
-
代码逻辑过程:
-
代码实现:
/***
* 1,暴力破解法
* 就是使用两个for循环,这种效率很差
*/
public int[] twoSum01(int[] nums, int target){
if (null == nums || nums.length == 0 ){
return nums;
}
int length = nums.length;
for (int i = 0; i < length; i++){
for (int j = i; j < length; j ++){
if (nums[i] + nums[j] == target){
return new int[]{i, j};
}
}
}
return new int[]{-1, -1};
}
-
解法二:
-
边界问题:使用Map数据结构
-
解题思路:
- 声明Map 数据结构变量map,对应的key为入参数组的元素,对应的value为入参数组的index坐标
- 当循环的数组元素与target 相差的元素可以在Map中找到时,即表明入参数组中,存在对应的答案
-
代码逻辑过程:
-
代码实现:
/***
* 2,使用Map数据结构
*/
public int[] twoSum02(int[] nums, int target){
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++){
if (map.containsKey(target - nums[i])){
return new int[]{i, map.get(target - nums[i])};
}else {
map.put(nums[i], i);
}
}
map.clear();
return new int[]{-1, -1};
}