第 01 天题目
0001. 两数之和
- 标签:数组、哈希表
- 难度:简单
题目描述
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
解题思路
- 使用双循环算法判断每一组的和是否等于目标值,如果是,定义一个长度为2的数组a,将两个数字保存在数组a中,最后返回数组a,若不是,返回数组a。
- 时间复杂度小于O(n2)
- 代码实现:
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] a = new int[2];
int n = nums.length;
for(int i = 0;i < n ; i++){
for(int j = i + 1 ; j < n ; j++){
if(nums[i] + nums[j] == target){
a[0] = i;
a[1] = j;
return a;
}
}
}
return a;
}
}
第二天题目
0704.二分查找
标签:二分查找
难度:简单
题目描述
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
解题思路
给的数组是有序且递增的,那么我们就可以用二分法查找。首先选择数组中间的数字和目标值对比,如果相等直接返回数组中间下标对应的值;如果中间数字对应的值大于目标值,直接排除数组中间数字向右的值,同时将数组中间的下标变为上限,继续查找;如果中间数字对应的值小于目标值,直接排除数组中间数字向左的值,同时将数组中间+1的下标变为下限,继续查找;如果都找不到就返回-1。
代码实现:
class Solution {
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length;
while (left < right){
int middle = left + (right - left) / 2;
if (nums[middle] > target){
right = middle;
}
else if (nums[middle] < target){
left = middle + 1;
}
else{
return middle;
}
}
return -1;
}
}
第三天题目:
0027.移除元素
标签:数组
难度:简单
题目描述:
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
题解思路:
先找到数组中数组共有多少个数字与val的值不相等,记为则有 len - count 个元素与val的值相等。按顺序逐个扫描数组,找出第一个与val相等的元素,将它移到数组的最后一个位置处。按顺序逐个扫描数组,找出第二个与val相等的元素,将它移到数组的倒数第二个位置处。 按顺序逐个扫描数组,找出第 i 个与 val 相等的元素,将它移到数组的倒数第len - k -1位置处。
代码实现:
class Solution {
public int removeElement(int[] nums, int val) {
int i=0;
int count=0;
int len=nums.length;
for(i=0;i<len;i++){
if(nums[i]!=val)
{
count++;
}
}
int t=count;
for(int k=0;k<len-count;k++)
{
for(i=0;i<len;i++)
if(nums[i]==val)
{
int tmp=nums[i];
nums[i]=nums[len-k-1];
nums[len-k-1]=tmp;
}
}
return t;
}
}
第四天题目:
0009.回文数
标签:字符串
难度:简单
题目描述:
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
例如,121 是回文,而 123 不是。
题解思路:
首先判断X是否是负数,如果是负数直接输出false,然后判断X是几位数,就将temp赋值为几位数,然后需要获取X第一位和最后一位,判断是否相同,之后将X比较过的第一位和最后一位去掉,注意X变化后temp也要跟着变。
代码实现:
第五天题目:
0020.有效的括号
标签:栈
难度:简单
题目描述:
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
题解思路:
这道题目很有意思,就和俄罗斯方块一样,但还有些区别,借助栈,先进去左括号“(,{,[”三个中的任何一个都行,进入栈后,下一个括号进入栈与其相匹配,如果相匹配则两个弹出栈,继续下面的操作,当最后栈里是empty时,返回True。
代码实现:
class Solution { public boolean isValid(String s) { Stack<Character>stack=new Stack<>(); for(char c:s.toCharArray()){ if(c=='{'||c=='['||c=='('){ stack.add(c); }else{ if(stack.size()==0){ return false; } char c1=stack.peek(); if(c=='}'){ if(c1=='{'){ stack.pop(); }else{ return false; } }else if(c==']'){ if(c1=='['){ stack.pop(); }else{ return false; } }else{ if(c1=='('){ stack.pop(); }else{ return false; } } } } return stack.isEmpty(); } }
第六天题目:
0035.搜索插入位置
标签:数组
难度:简单
题目描述:
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
题解思路:
形参是一个排序数组和一个目标值,先遍历这个排序数组,与目标之一个个比对,如果数组里的数大于等于目标值,则返回数组的下标,遍历完之后,数组里的数如果没有大于等于目标值的,则返回这个数组的长度,数组的长度即为插入数的下标
代码实现:
class Solution { public int searchInsert(int[] nums, int target) { for(int i = 0; i < nums.length;i++){ if(nums[i] >= target){ return i; } } return nums.length; } }