一.简单
1.两数之和
题目描述:
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
思路解析:非常简单,只需要双层for循环进行遍历即可,当nums[i]+nums[j] == target时,将此时的i与j存到数组中,将该数组返回即可。
代码:
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] arr = new int[2];
for(int i=0;i<nums.length;i++){
for(int j=i+1;j<nums.length;j++){
if(nums[i]+nums[j] == target){
arr[0] = i;
arr[1] = j;
}
}
}
return arr;
}
}
2.删除有序数组中的重复项
题目描述:
给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。
将最终结果插入 nums 的前 k 个位置后返回 k 。
不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成
思路解析:首先定义两个指针,一个是快指针fast,一个是慢指针slow,如果数组只有一个元素将不会有重复元素,所以我们将快慢指针的位置开始初始化为1,快指针需要遍历数组的1~n-1,而慢指针只有当满足nums[fast]!=nums[fast-1],这是我们将此时fast位置的值赋值给nums[slow],并将slow向右移动一个位置,重复执行此过程,直到fast到达数组的最后一个元素,此时slow的值就是删除数组重复项之后数组的长度。
代码:
class Solution {
public int removeDuplicates(int[] nums) {
if(nums.length == 0){
return 0;
}
int fast=1,slow=1;
while(fast < nums.length){
if(nums[fast] != nums[fast-1]){
nums[slow] = nums[fast];
++slow;
}
++fast;
}
return slow;
}
}
3.移除元素
题目描述:
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
思路解析:首先我们定义两个指针,left指针与right指针,并将其初始化为0,right指针需要从0~n-1遍历数组,只要nums[right] != val,说明该位置的元素是一定在移除后的数组中的,我们就将nums[right]的值赋值给nums[left],并使得left与right都往右移动一位。反之,说明该元素是一定不在移除后的数组中的,只需要将right向右一位即可。
代码:
class Solution {
public int removeElement(int[] nums, int val) {
int left = 0,right = 0;
while(right < nums.length){
if(nums[right] != val){
nums[left] = nums[right];
left++;
}
right++;
}
return left;
}
}
3.删除有序数组中的重复项
题目描述:
思路解析:
代码:
3.删除有序数组中的重复项
题目描述:
思路解析:
代码:
3.删除有序数组中的重复项
题目描述:
思路解析:
代码:
3.删除有序数组中的重复项
题目描述:
思路解析:
代码:
3.删除有序数组中的重复项
题目描述:
思路解析:
代码:
3.删除有序数组中的重复项
题目描述:
思路解析:
代码:
3.删除有序数组中的重复项
题目描述:
思路解析:
代码:
3.删除有序数组中的重复项
题目描述:
思路解析:
代码: