第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; } }