LeetCode 课程 Task02 学习打卡(2022年11月27日)

第01天题目

0069.x的平方根

标签:二分查找,牛顿迭代

难度:简单

题目描述:

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。

由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。

注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。


解题思路:

使用二分法进行求解,注意的是如果使用的是int,那么就不能写成midmid==x这样,因为midmid可能超过int的范围,造成越界异常,跳出循环就是当left==right的时候,所以我们需要在left负值时候将res也一起负值。

代码实现:

 第二天题目:

0217:存在重复元素

标签:set

难度:简单

题目描述:

给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。

解题思路:

使用Set去重,然后利用循环遍历判断元素是否在集合中,不在就将此元素保存在set中,直到遍历结束,返回false,如果在遍历的过程中有重复的,则返回true。

代码实现:

class Solution {
    public boolean containsDuplicate(int[] nums) {
        Set<Integer> s= new HashSet<>();
        for(int num: nums){
            if(s.contains(num)){
                return true;
            }
            s.add(num);
        }
        return false;
    }
}

第三天题目:

0035:搜索插入位置

标签:二分查找

难度:简单

题目描述:

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。


解题思路:

- 先设定左侧下标 left 和右侧下标right,再计算中间下标mid
-每次根据 nums[mid] 和 target 之间的大小进行判断,相等则直接返回下标,nums(mid]< target 则left
右移,nums[mid]> target 则 right 左移
-查找结束如果没有相等值则返回left,该值为插入位置

代码实现:

class Solution {
    public int searchInsert(int[] nums, int target) {
        int n = nums.length;
        int left = 0, right = n - 1;
        while (left <= right){
            int middle = left + (right - left) / 2;
            if (nums[middle] > target){
                right = middle - 1;
            }
            else if (nums[middle] < target){
                left = middle + 1 ;
            }
            else {
                return middle;
            }
        }
        return left;
    }
}

第四天题目:

0016:最接近的三数之和

标签:排序,双指针

难度:中等

题目描述:

给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。

返回这三个数的和。

假定每组输入只存在恰好一个解。

来源:力扣(LeetCode)

解题思路:

先排序,然后再遍历,排序是为了内部使用双指针,通过目标值与三数之和相减的绝对值大小来判断哪个最接近,如果是直接等于目标值,那么即是最接近的,否则返回,最接近的数

代码实现:

class Solution {
    public int threeSumClosest(int[] nums, int target) {
                // 排序
        Arrays.sort(nums);
        int closestNum = nums[0] + nums[1] + nums[2];
        for (int i = 0; i < nums.length - 2; i++) {
            int l = i + 1, r = nums.length - 1;
            while (l < r){
                int threeSum = nums[l] + nums[r] + nums[i];
                if (Math.abs(threeSum - target) < Math.abs(closestNum - target)) {
                    closestNum = threeSum;
                }
                if (threeSum > target) {
                    r--;
                } else if (threeSum < target) {
                    l++;
                } else {
                    // 如果已经等于target的话, 肯定是最接近的
                    return target;
                }

            }

        }

        return closestNum;

    }
}

第五天题目:

0007:整数翻转

标签:

难度:中等

题目描述:

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ,就返回 0。

来源:力扣(LeetCode)

解题思路:

先定义一个res保存x的反转数,当x不等于0时,进行循环。定义一个tmp每次保存末尾数字,然后判断是否大于最大32位整数和小于最小32位整数,如果是,返回0,如果不是,则res等于上一个res乘以十加上当前末尾数字,x/10。最后返回得到的反转数字。

代码实现:

class  Solution  {
                public  int  reverse(int  x)  {
                        int  res  =  0;
                        while(x!=0)  {
                                int  tmp  =  x%10;
                                if  (res>214748364  ||  (res==214748364  &&  tmp>7))  {
                                        return  0;
                                }
                                if  (res<-214748364  ||  (res==-214748364  &&  tmp<-8))  {
                                        return  0;
                                }
                                res  =  res*10  +  tmp;
                                x  /=  10;
                        }
                        return  res;
                }
        }

第六天题目:

1748.唯一元素的和

标签:排序

难度:简单

题目描述:

给你一个整数数组 nums 。数组中唯一元素是那些只出现 恰好一次 的元素。

请你返回 nums 中唯一元素的  。

示例 1:

输入:nums = [1,2,3,2]
输出:4
解释:唯一元素为 [1,3] ,和为 4 。

解题思路:

通过一次遍历,每次遇到数先加,然后seen数组标记一下次数已出现,置为1,若再次出现则从sum中减去此数并置为2。最终得到sum。

代码实现:

class Solution {
    public int sumOfUnique(int[] nums) {
        int[] seen = new int[100];
        int sum = 0;
        for (int num : nums) {
            if (seen[num - 1] == 0) {
                sum += num;
                seen[num - 1] = 1;
            } else if (seen[num - 1] == 1) {
                sum -= num;
                seen[num - 1] = 2;
            }
        }
        return sum;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值