1、两数之和
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | /*建一个hash表,key存放值,value存放下标 遍历数组,如果表里存在target - nums[i],则返回下标 不存在则把当前的数存到hash表 */ class Solution { public int [] twoSum( int [] nums, int target) { Map<Integer, Integer> hashtable = new HashMap<Integer, Integer>(); for ( int i = 0 ; i < nums.length; ++i) { if (hashtable.containsKey(target - nums[i])) { return new int []{hashtable.get(target - nums[i]), i}; } hashtable.put(nums[i], i); } return new int [ 0 ]; } } |
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 }
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 }
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 }
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 }
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 }
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 }
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 }
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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理