首页 > 其他分享 >【每日一题】[2441. 与对应负数同时存在的最大正整数]

【每日一题】[2441. 与对应负数同时存在的最大正整数]

时间:2023-05-13 10:44:53浏览次数:48  
标签:2441 正整数 val nums 负数 ans var hash 1000

【每日一题】2441. 与对应负数同时存在的最大正整数

给你一个 不包含 任何零的整数数组 nums ,找出自身与对应的负数都在数组中存在的最大正整数 k 。

返回正整数 k ,如果不存在这样的整数,返回 -1 。

示例 1:

输入:nums = [-1,2,-3,3]
输出:3
解释:3 是数组中唯一一个满足题目要求的 k 。

示例 2:

输入:nums = [-1,10,6,7,-7,1]
输出:7
解释:数组中存在 1 和 7 对应的负数,7 的值更大。

示例 3:

输入:nums = [-10,8,6,7,-2,-3]
输出:-1
解释:不存在满足题目要求的 k ,返回 -1 。

提示:

  • 1 <= nums.length <= 1000
  • -1000 <= nums[i] <= 1000
  • nums[i] != 0
1 双指针
  • 首先对数组升序排序
  • 设置两个指针,i从前往后、j从后往前
  • 如果sum>0,说明已经没有j对应的负数了(i是目前最小的,不会有更小的让sum=0的了),所以j指针应该左移
  • 同理sum<0,说明当前i值太小,因此可能存在让目前最大值j加和为0的值,i指针应该右移
  • 时间复杂度O(n + logn),但是双指针比较巧妙没有想到
class Solution {
    public int findMaxK(int[] nums) {
        Arrays.sort(nums);
        var i = 0;
        var j = nums.length - 1;

        while(i < j) {
            var sum = nums[i] + nums[j];
            if(sum > 0) {
                j--;
            } else if(sum < 0) {
                i++;
            } else {
                return nums[j];
            }
        }
        return -1;
    }
}
2 哈希
  • 正常想法,O(N)
class Solution {
    public int findMaxK(int[] nums) {
        var len = nums.length;
        var hash = new boolean[2 * 1000 + 1];
        var ans = -1;
        for(var i = 0; i < len; i++) {
            hash[nums[i]+1000] = true;
        }
        for(var i = 0; i < len; i++) {
            var dumy = -nums[i];
            if(hash[dumy+1000]) {
                ans = Math.max(ans, dumy);
            }
        }

        return ans;
    }
}
  • 评论区看到的,第一眼没看懂
class Solution {
    public int findMaxK(int[] nums) {
        var len = nums.length;
        var hash = new boolean[2000+1];
        var ans = -1;
        for(var i = 0; i < len; i++) {
            var val = nums[i];
            hash[1000+val] = true;
            if(val < 0 && hash[1000 - val] && -val > ans) {
                ans = Math.max(ans, -val);
            } else if(val > 0 && hash[1000 - val] && val > ans) {
                ans = Math.max(ans, val);
            }
        }
        return ans;
    }
}

标签:2441,正整数,val,nums,负数,ans,var,hash,1000
From: https://www.cnblogs.com/tod4/p/17396893.html

相关文章

  • 2022-02-21:不含连续1的非负整数。 给定一个正整数 n ,返回范围在 [0, n] 都非负整数中,
    2022-02-21:不含连续1的非负整数。给定一个正整数n,返回范围在[0,n]都非负整数中,其二进制表示不包含连续的1的个数。输入:n=5输出:5解释:下面是带有相应二进制表示的非负整数<=5:0:01:12:103:114:1005:101其中,只有整数3违反规则(有两个连续的1),其......
  • 2023-05-02:如果一个正整数每一个数位都是 互不相同 的,我们称它是 特殊整数 。 给你一
    2023-05-02:如果一个正整数每一个数位都是互不相同的,我们称它是特殊整数。给你一个正整数n,请你返回区间[1,n]之间特殊整数的数目。输入:n=20。输出:19。答案2023-05-02:可以通过数字组合和状态压缩的动态规划算法来解决。具体过程如下:1.对于给定的正整数n,求出其位数......
  • 怎样制作从负数开始的序列号
    在使用条码标签软件时,有的用户除了批量制作条码或二维码,也会制作一些序列号。我们通常用到的序列号都是0、1、……、8、9这种的,但是如果需要的序列号是从负数开始,像“-10、-9、-8、……0、1、2、3…”这种的(如下图),要怎么实现呢?下面我们演示一下在条码标签软件中制作从负数开始的序......
  • 1351. 统计有序矩阵中的负数(leetcode)
    https://leetcode.cn/problems/count-negative-numbers-in-a-sorted-matrix/1351.统计有序矩阵中的负数1.二分法:把每一行进行一遍二分,找到正数与负数的边界,且此时grid[i][mid]也为负数,即边界下标的对应值是负数的左半边界那么一行中的个数即为size()-lclassSolution{pu......
  • awk判断整除(包含小数和负数)
    awk判断整除常用的方法是用内置的int或者求余数的算符%被整数整除输出0-100之间能被9整除的整数使用num/9==int(num/9)的判断方法可以很好实现。awk'BEGIN{for(i=0;i<100;i++){if(i/9==int(i/9))printi}}'|cat或者使用num%9==0也可以轻松实现......
  • C# 将负数转正数 Math.Abs​​(value)
    在应用任何算术运算之前,您应该应用Math.Abs(value)它将您的负值转换为正值。usingSystem;classProgram{  staticvoidMain(string[]args)  {    decimals=Convert.ToDecimal(0);    decimals2=Convert.ToDecimal(-1.65);decimals3=Convert.ToDecim......
  • 给定一个正整数字符串,使用Python正则表达式在其千分位上添加逗号
    大家好,我是皮皮。一、前言前几天在Python黄金青铜群【沐】问了一个Python正则表达式的问题,这里拿出来给大家分享下。题目:给定一个正整数字符串,如12345678、345678,使用正则表达式在其千分位上添加逗号,如12,345,678、345,678。二、实现过程这里ChatGPT给了一个答案,可以使用......
  • 2022-04-22:给你两个正整数数组 nums 和 target ,两个数组长度相等。 在一次操作中,你可
    2022-04-22:给你两个正整数数组nums和target,两个数组长度相等。在一次操作中,你可以选择两个不同的下标i和j,其中0<=i,j<nums.length,并且:令nums[i]=nums[i]+2且令nums[j]=nums[j]-2。如果两个数组中每个元素出现的频率相等,我们称两个数组是相似的......
  • T226689 求两个正整数的乘积
    题目描述给你两个正整数\(A\)和\(B\),\((1<=A,B<=10^{2000})\)。求\(A\)与\(B\)的乘积。输入格式包括一行,两个正整数\(A\)和\(B\),\((1<=A,B<=10^{2000})\)。输出格式一行,一个正整数表示乘积。样例#1样例输入#137样例输出#121代码及其思路由题A,B两数的范围......
  • C语言:求正整数的所有质数因子(如:180:2 2 3 3 5)
    #include<stdio.h>#求正整数的所有质数因子(如:180:22335)main(){intm,i;scanf("%d",&m);for(i=2;i<=m;i++){if(m%i==0){printf("%3d",i);m=m/i;......