Leetcode刷题-(16~20)-Java+Python+JavaScript

 

算法是程序员的基本功,也是各个大厂必考察的重点,让我们一起坚持写算法题吧。

遇事不决,可问春风,春风不语,即是本心。

我们在我们能力范围内,做好我们该做的事,然后相信一切都事最好的安排就可以啦,慢慢来,会很快,向前走,别回头。

目录

1.最接近三数之和

2.电话号码的字母组合

3.四数之和

4.删除链表的倒数第 N 个结点

5.有效的括号


1.最接近三数之和

题目链接:. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/3sum-closest/description/

思路:1.三层循环暴力法。

2.排序+双指针。

Java版:
 

class Solution {public int threeSumClosest(int[] nums, int target) {int min = Integer.MAX_VALUE ;int res = 0 ;for(int i=0; i<nums.length; i++){for(int j=i+1; j<nums.length; j++){for(int k=j+1; k<nums.length; k++){int abs = Math.abs(target -(nums[i] + nums[j] + nums[k]) ) ;if(abs < min){min = abs ;res = nums[i] + nums[j] + nums[k] ;}}}}return res ;}
}
class Solution {public int threeSumClosest(int[] nums, int target) {// 排序+双指针Arrays.sort(nums) ;int res = 0 ;int min = Integer.MAX_VALUE ;for(int i=0; i<nums.length-1; i++){int left = i+1, right = nums.length - 1 ;while(left < right){int sum = nums[i] + nums[left] + nums[right] ;int abs = Math.abs(sum - target) ;if(abs < min){min = abs ;res = sum ;}if(sum == target){return sum ;}else if(sum < target){left ++ ;}else{right -- ;}}}return res ;}
}

Python版:

class Solution:def threeSumClosest(self, nums: List[int], target: int) -> int:nums.sort() l = len(nums)res = 0 min = 1000000for i in range(l-2):left = i+1right = l - 1while(left < right):sum = nums[i] + nums[left] + nums[right]sub = abs(sum - target)if(sub < min):min = subres = sum if (sum == target):return sum elif(sum < target):left += 1else:right -= 1return res 

Javascript版:

/*** @param {number[]} nums* @param {number} target* @return {number}*/
var threeSumClosest = function(nums, target) {// JS需要自定义排序规则,因为默认情况是按照字符串进行排序,而不是数值nums.sort(function(a,b){return a - b}) let res = 0 let min = 10000000for(let i=0; i<nums.length; i++){let left = i + 1, right = nums.length - 1while(left < right){const sum = nums[i] + nums[left] + nums[right] const abs = Math.abs(sum - target)if(abs < min){min = absres = sum }if(sum == target){return sum}else if(sum > target){right -- }else{left ++ }}}return res 
};

2.电话号码的字母组合

题目链接:. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/letter-combinations-of-a-phone-number/description/
思路:方法1:条件函数判断+字符串拼接

方法2:hashmap+dfs

Java版:
 

class Solution {public List<String> letterCombinations(String digits) {List<String> list = new ArrayList<>() ;String str = "" ;String [] arr = new String[4] ;Arrays.fill(arr,"") ;for(int i=0; i<digits.length(); i++){arr[i] = f(digits.charAt(i)) ;}for(int i=0; i<arr[0].length(); i++){if(arr[1].length()==0){StringBuilder sb = new StringBuilder("") ;sb.append(arr[0].charAt(i)) ;list.add(sb.toString()) ;}for(int j=0; j<arr[1].length(); j++){if(arr[2].length()==0){StringBuilder sb = new StringBuilder("") ;sb.append(arr[0].charAt(i)).append(arr[1].charAt(j)) ;list.add(sb.toString()) ;     }for(int k=0;  k<arr[2].length(); k++){if(arr[3].length()==0){StringBuilder sb = new StringBuilder("") ;sb.append(arr[0].charAt(i)).append(arr[1].charAt(j)).append(arr[2].charAt(k)) ;list.add(sb.toString()) ;}for(int l=0;  l<arr[3].length(); l++){StringBuilder sb = new StringBuilder("") ;sb.append(arr[0].charAt(i)).append(arr[1].charAt(j)).append(arr[2].charAt(k)).append(arr[3].charAt(l)) ;list.add(sb.toString()) ;}}}}return list ;}
public static String f(char c){switch(c){case '2': return "abc";case '3': return "def";case '4': return "ghi";case '5': return "jkl"; case '6': return "mno";case '7': return "pqrs";case '8': return "tuv";case '9': return "wxyz";default : return "";}
}
}
class Solution {public List<String> letterCombinations(String digits) {List<String> list = new ArrayList<>() ;Map<Character,String> map = new HashMap<>() ;if(digits.length() == 0){return list ;}map.put('2',"abc") ;map.put('3',"def") ;map.put('4',"ghi") ;map.put('5',"jkl") ;map.put('6',"mno") ;map.put('7',"pqrs") ;map.put('8',"tuv") ;map.put('9',"wxyz") ;dfs(map,digits,0,list,new StringBuilder()) ;return list ;
}
public void dfs(Map<Character, String> map,String digits, int k, List<String> list, StringBuilder sb){if(k==digits.length()){list.add(sb.toString()) ;}else{String s = map.get(digits.charAt(k)) ;for(int i=0; i<s.length(); i++){sb.append(s.charAt(i)) ;dfs(map,digits,k+1,list,sb) ;sb.deleteCharAt(k) ;}}
}
}

Python版:

class Solution:def letterCombinations(self, digits: str) -> List[str]:list = []d = {}if len(digits) == 0:return listd['2'] = "abc"d['3'] = "def"d['4'] = "ghi"d['5'] = "jkl"d['6'] = "mno"d['7'] = "pqrs"d['8'] = "tuv"d['9'] = "wxyz"self.dfs(list,d,0,"",digits)return list def dfs(self, list, d, k, s,digits):if k == len(digits):list.append(s)else:tmp = d[digits[k]]for i in range(len(tmp)):s += tmp[i]self.dfs(list,d,k+1,s,digits)s = s[:k] + s[k+1:]
3.四数之和

题目链接:. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/4sum/description/
思路:方法1:四层循环

方法2:排序+双指针+三层循环

Java版:
超时版:

class Solution {public List<List<Integer>> fourSum(int[] nums, int target) {List<List<Integer>> res = new ArrayList<>() ;for(int i=0; i<nums.length; i++){for(int j=i+1; j<nums.length; j++){for(int k=j+1; k<nums.length; k++){for(int l=k+1; l<nums.length; l++){if(target == (nums[i] + nums[j] + nums[k] + nums[l])){List<Integer> tmp = new ArrayList<>() ;tmp.add(nums[i]) ;tmp.add(nums[j]) ;tmp.add(nums[k]) ;tmp.add(nums[l]) ;Collections.sort(tmp) ;if(!res.contains(tmp)){res.add(tmp) ;}}}}}}return res ;}
}

击败5%的Java用户版:

class Solution {public List<List<Integer>> fourSum(int[] nums, int target) {List<List<Integer>> res = new ArrayList<>() ;Arrays.sort(nums) ;for(int i=0; i<nums.length; i++){for(int j=i+1; j<nums.length; j++){int left = j+1, right = nums.length - 1 ;while(left < right){// 防止超出整型最大范围long sum =  (long)nums[i] + (long)nums[j] + (long)nums[left] + (long)nums[right] ;if(target == sum){List<Integer> tmp = new ArrayList<>() ;tmp.add(nums[i]) ;tmp.add(nums[j]) ;tmp.add(nums[left]) ;tmp.add(nums[right]) ;Collections.sort(tmp) ;if(!res.contains(tmp)){res.add(tmp) ;}right -- ;}else if(target > sum){left ++ ;}else{right -- ;}}}}return res ;}
}

击败50%的Java选手:
 

class Solution {public List<List<Integer>> fourSum(int[] nums, int target) {List<List<Integer>> res = new ArrayList<>() ;Arrays.sort(nums) ;for(int i=0; i<nums.length; i++){// 去重if(i>0 && nums[i] == nums[i-1]){continue ;}for(int j=i+1; j<nums.length; j++){// 去重if(j>i+1 && nums[j] == nums[j-1]){continue ;}int left = j+1, right = nums.length - 1 ;while(left < right){// 防止超出整型最大范围long sum =  (long)nums[i] + (long)nums[j] + (long)nums[left] + (long)nums[right] ;if(target == sum){while(left < right && nums[left] == nums[left+1]){left ++ ;}while(left < right && nums[right] == nums[right-1]){right -- ;}List<Integer> tmp = new ArrayList<>() ;tmp.add(nums[i]) ;tmp.add(nums[j]) ;tmp.add(nums[left]) ;tmp.add(nums[right]) ;res.add(tmp) ;left ++ ;right -- ;}else if(target > sum){left ++ ;}else{right -- ;}}}}return res ;}
}

Python版:

class Solution:def fourSum(self, nums: List[int], target: int) -> List[List[int]]:res = []nums.sort()for i in range(0,len(nums)-2):if i>0 and nums[i] == nums[i-1]:continuefor j in range(i+1,len(nums)-1):if j>i+1 and nums[j] == nums[j-1]:continueleft = j + 1right = len(nums) - 1while left < right:sum = nums[i] + nums[j] + nums[left] + nums[right]if(sum == target):while(left < right and nums[left] == nums[left+1]):left += 1while(left < right and nums[right] == nums[right-1]):right -= 1res.append([nums[i],nums[j],nums[left],nums[right]])left  += 1right -= 1elif(sum > target):right -= 1else:left += 1return res 

Js版:

/*** @param {number[]} nums* @param {number} target* @return {number[][]}*/
var fourSum = function(nums, target) {nums.sort(function(a,b){return a - b })const res = []for(let i=0; i<nums.length; i++){if(i>0 && nums[i] == nums[i-1]){continue }for(let j=i+1; j<nums.length; j++){if(j>i+1 && nums[j] == nums[j-1]){continue}let left = j + 1, right = nums.length - 1while(left < right){const sum = nums[i] + nums[j] + nums[left] + nums[right] if(sum === target){while(left < right && nums[left] == nums[left+1]){left ++}while(left < right && nums[right] == nums[right-1]){right -- }res.push([nums[i],nums[j],nums[left],nums[right]])left ++ right --}else if(sum > target){right -- }else{left ++ }}}}return res 
};
4.删除链表的倒数第 N 个结点

题目链接:. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/

思路:先计算链表长度,然后找到相应的结点位置,修改指针即可。

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {// 找到倒数第n个节点,然后修改指针即可ListNode p = head ;int len = 0 ;while(p != null){len ++ ;p = p.next ;}if(n > len){return head ;}if(len==n){head = head.next ;return head ;}ListNode cur = head.next ;ListNode pre = head ;ListNode res = pre ;for(int i=0; i<len-n-1; i++){pre = pre.next ;cur = pre.next ;}pre.next = cur.next ;return res ;}
}

5.有效的括号

题目链接:. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/valid-parentheses/

思路:HashMap存储映射关系,栈模拟匹配括号匹配过程。

class Solution {public boolean isValid(String s) {Map<Character,Character> map = new HashMap<>() ;map.put('{','}') ;map.put('(',')') ;map.put('[',']') ;LinkedList<Character> stack = new LinkedList<>() ;for(int i=0; i<s.length(); i++){char c = s.charAt(i) ;if(c == '{' || c == '(' || c == '['){stack.push(c) ;}else{// 没有匹配的左括号,右括号多if(stack.isEmpty()){return false ;}char top = stack.pop() ;if(s.charAt(i) != map.get(top)){return false ;}}}// 栈不空,说明左括号多,没匹配if(stack.isEmpty() == false){return false ;}return true ;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/509952.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FreeBSD下使用PrintScreen按键截屏

一直不知道FreeBSD下怎么一键截屏&#xff0c;今日看到键盘上有PrtSc键盘&#xff0c;于是按了一下&#xff0c;看到提示&#xff1a;没有xfce4-screenshooter命令。 于是使用pkg安装&#xff1a;pkg install xfce4-screenshooter-plugin 安装完成后&#xff0c;再按PrtSC键&am…

idea运行springcloud+nacos项目

最近是下载了 linkwechat 这个开源项目&#xff0c;第一步就是要本地运行项目。(本人MAC 电脑) 由于本人的经验很少接触cloud &#xff0c;所以都忘记了怎么运行&#xff0c;然后一步步琢磨&#xff0c;下面就记录一下我运行这个项目的步骤吧 根据 如何使用 Docker 部署 Link…

YOLOv9有效改进专栏汇总|未来更新卷积、主干、检测头注意力机制、特征融合方式等创新!

YOLOv9有效改进专栏&#xff01; 专栏介绍 YOLOv9作为最新的YOLO系列模型&#xff0c;对于做目标检测的同学是必不可少的。本专栏将针对2024年最新推出的YOLOv9检测模型&#xff0c;使用当前流行和较新的模块进行该进。本专栏于2024年2月29日晚创建&#xff0c;预计四月底前加入…

小程序控制设备开发:轻松实现设备互联互通

随着物联网技术的快速发展&#xff0c;越来越多的设备可以通过网络进行连接和控制。小程序作为一种轻便的应用&#xff0c;为用户提供了便捷的操作方式&#xff0c;也成为了设备控制的理想选择。 小程序控制设备开发可以通过以下步骤实现&#xff1a; 确定设备类型和连接方式…

栈的OJ一小道-->Leetcode有效的括号

20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; 这道题我们乍一看可能会选择暴力遍历法,但这题我们可以选择栈,这样可以大大降低我们的时间复杂度.这题要求非常简单 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型…

高维中介数据:基于交替方向乘子法(ADMM)的高维度单模态中介模型的参数估计(入门+实操)

全文摘要 用于高维度单模态中介模型的参数估计&#xff0c;采用交替方向乘子法&#xff08;ADMM&#xff09;进行计算。该包提供了确切独立筛选&#xff08;SIS&#xff09;功能来提高中介效应的敏感性和特异性&#xff0c;并支持Lasso、弹性网络、路径Lasso和网络约束惩罚等不…

OSPF 普通区域stub实验简述

1、OSPF 普通区域stub配置 实验拓扑图 r1: sys sysname r1 undo info enable int loopb 0 ip add 1.1.1.1 32 quit int e0/0/0 ip add 172.16.1.1 24 quit ospf 1 area 0.0.0.1 network 172.16.1.0 0.0.0.255 network 1.1.1.1 0.0.0.0 Stub 配置普通区域 ret r6: sys sysnam…

Linux设备模型(十) - bus/device/device_driver/class

四&#xff0c;驱动的注册 1&#xff0c;struct device_driver结构体 /** * struct device_driver - The basic device driver structure * name: Name of the device driver. * bus: The bus which the device of this driver belongs to. * owner: The module own…

g2o -- curve_fit代码解析

概述 本文介绍通过g2o框架&#xff0c;优化点和曲线的匹配&#xff08;曲线拟合&#xff09;。曲线的公式如下所示&#xff1a; 它有三个参数&#xff1a;a, b, lamba。 代码解析 自定义顶点 /*** \brief the params, a, b, and lambda for a * exp(-lambda * t) b*/ clas…

[青少年CTF擂台挑战赛 2024 #Round] Misc 1ez_model

[青少年CTF擂台挑战赛 2024 #Round] Misc 1ez_model 题目描述&#xff1a;从Pytorch开始的AI之路 下载附件&#xff0c;是一个pth文件 .pth 文件通常是 PyTorch 模型的权重文件&#xff0c;它包含了模型的参数。要还原&#xff08;或加载&#xff09;一个大模型&#xff0c;你…

msvcp140.dll丢失的多种解决方法解析,总结4种msvcp140.dll修复的手段

msvcp140.dll是一个重要的系统文件&#xff0c;属于Microsoft Visual C Redistributable软件包。如果计算机显示找不到msvcp140.dll文件的错误&#xff0c;这通常意味着该文件丢失、损坏或未被正确注册。今天&#xff0c;我们将深入探究这个文件的相关知识&#xff0c;并提供一…

654.最大二叉树

这段Java代码实现了一个名为Solution的类&#xff0c;其中包含两个方法&#xff1a;constructMaximumBinaryTree()和constructMaximumBinaryTree1()&#xff0c;目的是从给定的整数数组nums中构建出一个最大二叉树。以下是详细的注释说明&#xff1a; class Solution {// 主方…