leetcode 150道题 计划花两个月时候刷完,今天(第十六天)完成了4道(38-41)150:
38.(1. 两数之和)题目描述:
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
第一版(这个题是我第一次接触leetcode时候,真的当时这个题也是费了好多时间,但是现在我真的都快能默写下来了,对我来说这道题是最经典的)
class Solution {
public int[] twoSum(int[] nums, int target) {
MapInteger,Integer> map=new HashMap();
for(int i=0;inums.length;i++){
int temp=target-nums[i];
if(map.containsKey(temp)){
return new int[]{map.get(temp),i};
}
map.put(nums[i],i);
}
return new int[]{};
}
}
39.(202. 快乐数)题目描述:
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」 定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果这个过程 结果为 1,服务器托管网那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false 。
第一版(看到这个题第一反应就是咋去判断什么时候该结束循环。。然后我就去百度百科查了一下:不快乐数都会进入 4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4 循环)
(但是解题里面有个老哥想法也很好,用快慢指针去计算,真的面试遇到我估计也会去用快慢指针去做的,定义啥的谁能记住。。)
class Solution {
public boolean isHappy(int n) {
// 不快乐数都会进入 4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4 循环
int[] nums={4,16,37,58,89,145,42,20,4};
int index=0;
while(indexnums.length&&n!=1){
n=toHappy(n);
if(n==nums[index]){
服务器托管网 index++;
}else{
index=0;
}
}
if(index==nums.length){
return false;
}
return true;
}
public int toHappy(int n) {
int sum=0;
while(n!=0){
int temp=n%10;
sum+=temp*temp;
n=n/10;
}
return sum;
}
}
第二版(老哥快慢指针)
class Solution {
public boolean isHappy(int n) {
int low=n;
int fast=n;
do{
low=toHappy(low);
fast=toHappy(fast);
fast=toHappy(fast);
}while(low!=fast);
return low==1;
}
public int toHappy(int n) {
int sum=0;
while(n!=0){
int temp=n%10;
sum+=temp*temp;
n=n/10;
}
return sum;
}
}
40.(219. 存在重复元素 II)题目描述:
给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) k 。如果存在,返回 true ;否则,返回 false 。
第一版(这个没啥好说的,直接上代码)
class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
MapInteger,Integer> map=new HashMap();
for(int i=0;inums.length;i++){
if(map.containsKey(nums[i])){
if(Math.abs(i-map.get(nums[i]))k){
return true;
}
}
map.put(nums[i],i);
}
return false;
}
}
41.(128. 最长连续序列)题目描述:
给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
第一版(题目让用O(n)的复杂度,但是我不知道我的是不是,所以我就先没管这个要求先做出来再说。。)
class Solution {
public int longestConsecutive(int[] nums) {
int len=nums.length;
if(len1)
return len;
Arrays.sort(nums);
int res=0;
int temp=1;
int preNum=nums[0];
for(int i=1;inums.length;i++){
if(preNum==nums[i])
continue;
if(nums[i]-1==preNum){
temp++;
}else{
res=Math.max(res,temp);
temp=1;
}
preNum=nums[i];
}
res=Math.max(res,temp);
return res;
}
}
第二版(看了解题,是真的O(n)!!!)
class Solution {
public int longestConsecutive(int[] nums) {
SetInteger> set=new HashSet();
for(int num:nums){
// 去除重复的数字
set.add(num);
}
int res=0;
for(int num:nums){
// 这个就是去判断这个数字能不能做头
if(!set.contains(num-1)){
int currentNum=num;
int temp=1;
// 看以这个头能走多远
while(set.contains(currentNum+1)){
currentNum++;
temp++;
}
res=Math.max(temp,res);
}
}
return res;
}
}
第十六天了好快,现在是又想过的快又想过的慢,好矛盾的我,加油吧,早日跳槽!!!!
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
相关推荐: C++新经典模板与泛型编程:策略技术中的算法策略
策略技术中的算法策略 在之前博客中funcsum()函数模板中,实现了对数组元素的求和运算。求和在这里可以看作一种算法,扩展一下思路,对数组元素求差、求乘积、求最大值和最小值等,都可以看作算法。 而当前的fu服务器托管网ncsum()函数模板中,已经将数组元素…