1、两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

  

2、寻找两个有序数组的中位数

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 

复制代码
 1 //合并两个数组再求中位数
 2 class Solution {
 3     public double findMedianSortedArrays(int[] nums1, int[] nums2) {
 4         int len1=nums1.length,len2=nums2.length;
 5         
 6         if(len1==0&&len2%2!=0)return nums2[len2/2];
 7         if(len1==0&&len2%2==0)return ((double)nums2[len2/2]+(double)nums2[len2/2-1])/2;
 8         if(len2==0&&len1%2!=0)return nums1[len1/2];
 9         if(len2==0&&len1%2==0)return ((double)nums1[len1/2]+(double)nums1[len1/2-1])/2;
10         int[] ans=new int[len1+len2];
11         int i=0,j=0,k=0;
12         while(i<len1&&j<len2){
13             if(nums1[i]<nums2[j]){
14                 ans[k++]=nums1[i++];
15                 
16             }else{
17                 ans[k++]=nums2[j++];
18             }
19         }
20         while(i<len1){
21             ans[k++]=nums1[i++];
22         }
23         while(j<len2){
24             ans[k++]=nums2[j++];
25         }
26         int sumlen=len1+len2;
27         //return sumlen;
28         if((sumlen)%2==0)return ((double)ans[sumlen/2]+(double)ans[sumlen/2-1])/2;
29         else return ans[sumlen/2];
30 
31     }
32 }
View Code
复制代码

 

3、盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

复制代码
 1 //双指针
 2 class Solution {
 3     public int maxArea(int[] height) {
 4         int maxarea=0;
 5         int left=0,right=height.length-1;
 6         while(left<right){
 7             int area=Math.min(height[left],height[right])*(right-left);
 8             if(area>maxarea)maxarea=area;
 9             if(height[left]<height[right]){
10                 left++;
11             }else{
12                 right--;
13             }
14         }
15         return maxarea;
16     }
17 }
View Code
复制代码

 

4、三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

复制代码
 1 class Solution {
 2     public static List<List<Integer>> threeSum(int[] nums) {
 3         List<List<Integer>> ans = new ArrayList();
 4         int len = nums.length;
 5         if(nums == null || len < 3) return ans;
 6         Arrays.sort(nums); // 排序
 7         for (int i = 0; i < len ; i++) {
 8             if(nums[i] > 0) break; // 如果当前数字大于0,则三数之和一定大于0,所以结束循环
 9             if(i > 0 && nums[i] == nums[i-1]) continue; // 去重
10             int L = i+1;
11             int R = len-1;
12             while(L < R){
13                 int sum = nums[i] + nums[L] + nums[R];
14                 if(sum == 0){
15                     ans.add(Arrays.asList(nums[i],nums[L],nums[R]));
16                     while (L<R && nums[L] == nums[L+1]) L++; // 去重
17                     while (L<R && nums[R] == nums[R-1]) R--; // 去重
18                     L++;
19                     R--;
20                 }
21                 else if (sum < 0) L++;
22                 else if (sum > 0) R--;
23             }
24         }        
25         return ans;
26     }
27 }
View Code
复制代码

 5、模拟

给你一个下标从 0 开始的数组 nums ,数组大小为 n ,且由 非负 整数组成。

你需要对数组执行 n - 1 步操作,其中第 i 步操作(从 0 开始计数)要求对 nums 中第 i 个元素执行下述指令:

如果 nums[i] == nums[i + 1] ,则 nums[i] 的值变成原来的 2 倍,nums[i + 1] 的值变成 0 。否则,跳过这步操作。
在执行完 全部 操作后,将所有 0 移动 到数组的 末尾 。

复制代码
 1 class Solution {
 2     public int[] applyOperations(int[] nums) {
 3         int n = nums.length;
 4         for (int i = 0, j = 0; i < n; i++) {
 5             if (i + 1 < n && nums[i] == nums[i + 1]) {
 6                 nums[i] *= 2;
 7                 nums[i + 1] = 0;
 8             }
 9             if (nums[i] != 0) {//j记录非0的末尾
10                 swap(nums, i, j);
11                 j++;
12             }
13         }
14         return nums;
15     }
16 
17     public void swap(int[] nums, int i, int j) {
18         int temp = nums[i];
19         nums[i] = nums[j];
20         nums[j] = temp;
21     }
22 }
View Code
复制代码

 6、移除元素

使用一个新的指针来表示值不等于val的元素

复制代码
 1 class Solution {
 2     public int removeElement(int[] nums, int val) {
 3         int p=0;
 4         for(int i=0;i<nums.length;i++){
 5             if(nums[i]!=val){
 6                 nums[p]=nums[i];
 7                 p++;
 8             }
 9         }
10         return p;
11 
12     }
13 }
View Code
复制代码

7、存在重复元素

数组中的任意一个元素出现至少两次返回true

复制代码
 1 class Solution {
 2     public boolean containsDuplicate(int[] nums) {
 3         HashSet<Integer> set=new HashSet<Integer>();
 4         for(int i=0;i<nums.length;i++){
 5             if(set.contains(nums[i])){
 6                 return true;
 7             }else{
 8                 set.add(nums[i]);
 9             }
10         }
11         return false;
12 
13     }
14 }
View Code
复制代码

 8、删除有序数组的重复项

给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

复制代码
 1 /**
 2 双指针,p指向新的数组下标,q遍历数组,遇到不重复的再写到p的位置
 3  */
 4 class Solution {
 5  public int removeDuplicates(int[] nums) {
 6     int p=0;
 7     int q=1;
 8     while(q < nums.length){
 9         if(nums[p] != nums[q]){
10             nums[p + 1] = nums[q];
11             p++;
12         }
13         q++;
14     }
15 
16     return p+1;
17  }
18 }
View Code
复制代码

9、删除有序数组的重复项(2)

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。

复制代码
 1 class Solution {
 2     public int removeDuplicates(int[] nums) {
 3         int n = nums.length;
 4         if (n <= 2) {
 5             return n;
 6         }
 7         int slow = 2, fast = 2;
 8         while (fast < n) {
 9             if (nums[slow - 2] != nums[fast]) {
10                 nums[slow] = nums[fast];
11                 ++slow;
12             }
13             ++fast;
14         }
15         return slow;
16     }
17 }
View Code
复制代码