- Three Sum(求三数之和)
思路:
1:对数组进行排序
2:依次取出第i个数作为定值,并且不重复的选取,目的是为了将三数求和转化为两数求和
3:定义两个指针,左指针和右指针
4:将定值与左右指针指向的数相加,如果定值=左右指针,那么记录这三个数,如果大于定值,右指针向左移,小于定值,左指针向右移动
代码:
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
if(nums.length == 0)
return result;
Arrays.sort(nums); //进行排序
int sum=0 ;
int left; // 左指针
int right; //右指针
for(int i=0;i<nums.length-2;i++){
if(i!=0 && nums[i]==nums[i-1]) //跳过重复的数字
{
continue;
}
left = i+1;
right = nums.length-1;
while(left<right){
sum = nums[left]+nums[right];
if(sum + nums[i] ==0){
List<Integer> solution = new ArrayList<>();
solution.add(nums[i]);
solution.add(nums[left]);
solution.add(nums[right]);
result.add(solution);
left++;
right--;
while(left<right && nums[left]==nums[left-1])
left++;
while(left<right && nums[right]== nums[right+1])
right--;
}else if(sum+nums[i]>0){
right--;
}else
left++;
}
}
return result;
}
}
- Majority Element(求众数)
思路:
从数组的下标1开始,如果与下一个数组下标的数字不相等,则count-- 当count 为0 就切换为下一个比较的数字
代码:
class Solution {
public int majorityElement(int[] nums) {
int count=1;
int major = nums[0];
for(int i=1;i<nums.length;i++){
if(major == nums[i])
count ++;
else{
count--;
if(count==0)
major = nums[i+1];
}
}
return major;
}
}
- Missing Positive(求缺失的第一个正数)
思路:
用数组本身做Hash,将i放在位置i-1处,如果i不在i-1处,那么就与i-1处的值进行交换
代码:
class Solution {
public int firstMissingPositive(int[] nums) {
for(int i=0;i<nums.length;i++){
if(nums[i]>0 && nums[i]<nums.length && nums[i]!=nums[nums[i]-1]){
int temp = nums[nums[i]-1];
nums[nums[i]-1] = nums[i];
nums[i] = temp;
i--; //交换完该位置上的数不一定是该位置上应有的数,所以重新判断
}
}
for(int i=0;i<nums.length;i++){
if(nums[i]!=i+1)
return i+1;
}
return nums.length+1;
}
}