首页 > 编程语言 >算法题——数组(一)

算法题——数组(一)

时间:2023-06-01 22:45:23浏览次数:50  
标签:return nums int len1 len2 算法 数组

1、两数之和

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

/*建一个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 }
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

 

标签:return,nums,int,len1,len2,算法,数组
From: https://www.cnblogs.com/coooookie/p/17450456.html

相关文章

  • 算法之二分法、三元表达式、列表生成式、字典生成式(了解)、匿名函数、常见的内置函数
    算法之二分法二分概念二分算法,又称折半查找,即在一个单调有序的集合中查找一个解。每次分为左右两部分,判断解在哪个部分中并调整上下界,直到找到目标元素,每次二分后都将舍弃一半的查找空间。定义and实现:算法就是解决问题的高效办法常见的算法:二分法算法还可以锻炼我们的......
  • 文心一言 VS 讯飞星火 VS chatgpt (28)-- 算法导论5.1 3题
    三、假设你希望以1/2的概率输出0与1。你可以自由使用一个输出0或1的过程BIASED-RANDOM。它以某概率p输出1,概率1-p输出0,其中0<p<1,但是p的值未知。请给出一个利用BIASED-RANDOM作为子程序的算法,返回一个无偏的结果,能以概率1/2返回0,以概率1/2返回1。作为p的函数,你的算......
  • 文心一言 VS 讯飞星火 VS chatgpt (28)-- 算法导论5.1 3题
    三、假设你希望以1/2的概率输出0与1。你可以自由使用一个输出0或1的过程BIASED-RANDOM。它以某概率p输出1,概率1-p输出0,其中0<p<1,但是p的值未知。请给出一个利用BIASED-RANDOM作为子程序的算法,返回一个无偏的结果,能以概率1/2返回0,以概率1/2返回1。作为p的函数,你的......
  • 代码随想录算法训练营第二十二天|235. 二叉搜索树的最近公共祖先,701. 二叉搜索树中的
    [参考链接]235.二叉搜索树的最近公共祖先[注意]1.因为是有序树,所以如果中间节点是q和p的公共祖先,那么中间节点的数组一定是在[p,q]区间的。即中节点>p&&中节点<q或者中节点>q&&中节点<p。2.那么只要从上到下去遍历,遇到cur节点是数值在[p,q]区间中则一......
  • glibc堆内存分配算法
    对于小于64字节的空间申请是采用类似于对象池的方法;对于大于512字节的空间申请采用的是最佳适配算法;对于大于64字节而小于512字节的,它会根据情况采取上述办法中的最佳折中策略;对于大于128KB的申请,它会使用mmap机制直接向操作系统申请空间。 空闲链表(最佳适配算法)将堆中各个空......
  • C语言数组
    数组概念在C语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。从内存角度,是一片连续的内存空间数组初始化://在编译时明确指定......
  • 第八课 常用机器学习算法性能对比
          市面上常用的机器学习算法,也就剩下KNN、朴素贝叶斯、决策树、随机森林这些算法了,这些算法各有优劣,适用不同的场景,没有谁能把所有其他的算法干掉而统一天下。      下面将通过准确率、耗时两个维度,来对比KNN、朴素贝叶斯、决策树、随机森林这几个算法的性能。......
  • 数组的应用以及二维数组
    1.Arrays工具类的使用类的全路径:java.util.Arrays举例:sort()方法作用:升序查询2.求最大值int[]scores=newint[5];intmax=0;System.out.println("请输入5位学员的成绩:");Scannerscanner=newScanner(System.in);for(inti=0;i<scores.length;i++){scores[i]=sc......
  • 常用的boosting算法
    boosting算法有许多种具体算法,包括但不限于adaboosting\GBDT\XGBoost。adaboosting原始数据集》某种算法拟合,会产生错误》根据上个模型预测结果,更新样本点权重(预测错误的结果权重增大)》再次使用模型进行预测》重复上述过程,继续重点训练错误的预测样本点。adabo......
  • 数组去重方法总结
    //基于单key或无key去重,单key一般是对象的id,无key就是元素本身是非对象exportfunctionuniqueArr(arr,key){letres;if(key){res=[...newMap(arr.map(t=>[t[key],t])).values()]}else{res=[...newSet(arr)]}returnre......