自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(43)
  • 收藏
  • 关注

原创 回文链表的判断

回文链表的判断一.前言先复习一下之前的知识。寻找回文串的核心思想是从中心向两边扩展:String pal(String s,int l,int r){ while(l>=0&& r<s.length()&& s.charAt(l)==s.charAt(r)) { l--; r++; } return s.subString(l+1,r);}判断一个字符串是不是回文串就简单了,不需要考虑奇偶情况,只需要双指针技巧,从两端向中间逼近:b

2021-04-01 22:45:09 179

原创 双指针技巧汇总

双指针技巧汇总一.前言双指针技巧一般可以分为两类,一类是快慢指针,一类是左右指针。前者主要解决链表中的问题,如典型的判定链表中是否包含环;后者主要解决数组(或者字符串)中的问题,如二分查找。二.快慢指针的常见算法快慢指针一般都初始化指向链表的头结点 head,前进时快指针 fast 在前,慢指针 slow 在后,巧妙解决一些链表中的问题。判定链表中是否含有环这应该属于链表中最基本的操作单链表的特点是每个节点只知道下一个节点,所以一个指针的话无法判断链表中是否含有环。如果链表中不含环,那么

2021-04-01 22:37:21 212

原创 子序列解题模板:最长回文子序列

子序列解题模板:最长回文子序列一. 前言一般来说,这类问题都是让你求一个最长子序列。一旦涉及到子序列和最值,考察的是动态规划技巧,时间复杂度一般都是 O(n^2)。原因很简单,你想想一个字符串,它的子序列有多少种可能?起码是指数级的吧,这种情况下,不用动态规划技巧,还想怎么着呢?既然要用动态规划,那就要定义 dp 数组,找状态转移关系。我们说的两种思路模板,就是 dp 数组的定义思路。不同的问题可能需要不同的 dp 数组定义来解决。二. 两种思路第一种思路模板是一个一维的dp数组:int

2021-04-01 13:05:26 597

原创 TCP/IP三次握手和四次挥手总结

TCP/IP三次握手和四次挥手总结一.TCP报文格式32位序号seq,32位确认序号ack,是对上一条发送的信息的确认;ACK是确认标志位,1/0;SYN位表示发起一个新的连接;FIN表示是否结束一个连接。二.三次握手具体的三次握手回答:TCP/IP 协议是传输层的一个面向连接的安全可靠的一个传输协议,三次握手的机制是为了保证能建立一个安全可靠的连接。那么第一次握手是由客户端发起,客户端会向服务端发送一个报文,在报文里面:SYN标志位置为1,表示发起新的连接。当服务端收到这个报文之后就知

2021-03-31 14:44:15 148

原创 单调栈解题

单调栈解题模板单调栈实际上就是栈,只是利用了一些巧妙的逻辑,使得每次新元素入栈后,栈内的元素都保持有序(单调递增或单调递减)。本文就通过几道算法题来看看单调栈模板的使用。一.单调栈模板给一个数组,返回一个等长的数组,对应索引存储着下一个更大元素,如果没有更大的元素,就存 -1。函数签名如下:vector<int> nextGreaterElement(vector<int>& nums);比如说,输入一个数组nums = [2,1,2,4,3],你返回数组[4

2021-03-30 20:44:31 86

原创 链表问题2——k个一组反转链表

链表问题2——k个一组反转链表一.分析问题如果我们对这个链表调用reverseKGroup(head,2),即以2个节点为一组反转链表:后面节点的处理实际上也是一条链表,且是长度更短的链表。这就是子问题。这就可以直接递归调用reverseKGroup(head,2)。具体的算法流程:1.先反转以head为开头的k个元素2.将第k+1个元素作为head递归调用reverseKGroup函数。3.将上述两个过程连接起来。最后一点值得注意的是,递归函数都有个 base case,对于这

2021-03-29 12:00:57 180

原创 链表问题1——递归反转链表

链表问题1——递归反转链表一.前言之前系统的把二叉树的大部分问题都过了一遍,但是目前还没有系统的总结,过两天要再梳理一下,整一篇汇总博客,自己理理思路。现在开始链表问题的复习。反转单链表的迭代实现不是一个困难的事情,但是递归实现就有点难度了。再难一点,如果只反转单链表中的一部分,是否能够递归实现。public class ListNode { int val; ListNode next; ListNode(int x) { val = x; }}迭代的思路:先用一个f

2021-03-29 11:13:36 200

转载 在浏览器中输入URL后执行的全部过程的个人总结

在浏览器中输入URL后执行的全部过程的个人总结从模型角度来分析问题,主要涉及:应用层:DNS,HTTP;传输层:TCP;网络层:IP和路由选择协议(RIP,OSPF(内部网关协议),BGP(外部网关协议));数据链路层:ARPI.首先,应用层:客户端浏览器通过DNS解析到www.baidu.com的IP地址220.181.27.48,通过这个IP地址找到客户端到服务器的路径。客户端浏览器发起一个HTTP会话到220.161.27.48,然后通过TCP进行封装数据包,输入到网络层。DNS解

2021-03-29 11:00:38 205 1

原创 经典计网问题——给定一个网址,访问过程是怎样的,涉及的协议(1)

给定一个网址,访问过程是怎样的,涉及的协议一.前言介绍接下来的内容以 www.cctv.com 央视网这样一个 HTTP 网站为例来进行讲述。需要注意的是,如果访问像 www.baidu.com 这样一个常见的域名,由于为百度已经采用了全站加密的技术,这样的话会出现一些重定向,比如从 http://www.baidu.com 重定向到 https://www.baidu.com,同时 SSL 层还有一个建立连接的过程,对于网络协议还不是那么熟悉的同学来说可能会显得较为复杂。因此这里面使用一个没有重定

2021-03-29 10:30:57 444

原创 计算机网络模型介绍——OSI七层模型 vs TCP/IP五层模型 及各层协议

OSI七层模型 vs TCP/IP五层模型 及各层协议一.OSI七层模型OSI七层模型(Open System Interconnect)即开放系统互连参考模型,是由ISO(International Organization for Standardization)国际标准化组织提出的,用于计算机或通信系统间互联的标准体系。从上到下可分为七层:每一层都完成特定的功能,并为上一层提供服务,并使用下层所提供的服务。应用层(Application):为用户的应用程序提供网络服务表示层(Present

2021-03-28 23:23:42 1246

原创 完全二叉树节点问题

完全二叉树节点问题一. 简介首先,明确一下完全二叉树和满二叉树的区别。下图是一颗完全二叉树,它的每一层都是紧凑靠左排列的:满二叉树则是一种特殊的完全二叉树,每层都是满的:计算一颗完全二叉树的节点个数,算法的时间复杂度应该为(logN*logN)。二.如何求一颗完全二叉树节点个数// 输入一棵完全二叉树,返回节点总数int countNodes(TreeNode root);普通的二叉树的话,很简单:int countNodes(TreeNode root){ if(root ==

2021-03-28 12:26:15 601

原创 二叉树的序列化和反序列化

二叉树的序列化和反序列化一. 前言JSON 的运用非常广泛,比如我们经常将变成语言中的结构体序列化成 JSON 字符串,存入缓存或者通过网络发送给远端服务,消费者接受 JSON 字符串然后进行反序列化,就可以得到原始数据了。这就是「序列化」和「反序列化」的目的,以某种固定格式组织字符串,使得数据可以独立于编程语言。那么假设现在有一棵用 Java 实现的二叉树,我想把它序列化字符串,然后用 Java读取这棵并还原这棵二叉树的结构,怎么办?这就需要对二叉树进行「序列化」和「反序列化」了。二.题目描述l

2021-03-27 11:49:29 538

原创 Java中HashSet和TreeSet的比较(具体)

Java中HashSet vs TreeSet一.HashSet其底层数据结构是哈希表,不保证顺序,是不同步的。在插入对象类型的时候,默认可以重复(属性值完全相同的对象),只有重写实体类的hashcode()和equals()方法后才可以防止插入重复对象。a. 首先通过hashcode()判断要插入对象的hashcode是否与set中已有对象相等,如果没有相等的则为不同的对象可以插入set,b. 如果有相等则继续通过equals()比较两个对象的每个属性是否完全相等,如相等则为重复对象,不能插入

2021-03-26 09:36:05 1988

原创 HashMap vs ConcurrentHashMap vs Hashtable

HashMap vs ConcurrentHashMap vs Hashtable引入ConcurrentHashMap是为了在同步集合HashTable之间有更好的选择,HashTable与HashMap、ConcurrentHashMap主要的区别在于HashMap不是同步的、线程不安全的和不适合应用于多线程并发环境下,而ConcurrentHashMap是线程安全的集合容器,特别是在多线程和并发环境中,通常作为Map的主要实现。除了线程安全外,他们之间还有一些细微的不同,本文会介绍到。HashMa

2021-03-26 09:16:28 76

原创 HashTable vs HashMap vs TreeMap vs LinkedHashMap对比

HashTable vs HashMap vs TreeMap vs LinkedHashMap对比一.总览HashMap:是被实现为hash table,键值排列是无序的。TreeMap: 是基于红黑树实现的,根据键进行排序的。LinkedHashMap:根据插入顺序排序。Hashtable:是同步的,对比HashMap多了同步的开销。这就是为什么HashMap应使用在线程安全的情况下。因为不同步,所以在多线程的环境下,进行put()会导致多线程数据不一致。二.HashMap如果键是自定义

2021-03-25 22:18:00 118 2

原创 Vector vs ArrayList vs LinkedList

Vector vs ArrayList vs LinkedList一.简介三者都实现了List接口,用法差不多,主要的区别在于它们对于不同操作的操作速度不同。ArrayList是可以改变大小的数组。当有元素添加到ArrayList中去时,它的大小动态的增加。元素可以直接通过get()和set()方法进行访问,因此ArrayList实际上是数组。LinkedList是个双向链表。它的add()和remove()方法比ArrayList快,但是get()和set()方法却比ArrayList慢。Vec

2021-03-25 21:44:56 100

原创 java中的序列化和反序列化(底层实现)

序列化和反序列化一.基本概念序列化和反序列化的定义:Java序列化就是指把Java对象转换为字节序列的过程。java反序列化就是指把字节序列恢复为Java对象的过程。序列化最重要的作用:在传递和保存对象时,保证对象的完整性和可传递性。对象转换为有序字节流,以便在网络上传输或者保存在本地文件中。反序列化最重要的作用:根据根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。总结:这两个过程的核心作用就是对象状态的保存和重建(整个过程的核心点就是字节流中保存的对象状态及描述信息)jso

2021-03-25 16:51:46 184

原创 经典面试问题—合并两个有序数组

合并两个有序数组给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。说明:初始化 nums1 和 nums2 的元素数量分别为 m 和 n。你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。示例:输入:nums1 = [1,2,3,0,0,0], m = 3nums2 = [2,5,6], n = 3输出: [1,2,2,3,5,6]最简单的思路,把他

2021-03-25 16:17:54 153

原创 二叉树算法总结(2)

二叉树算法总结(2)一.构造最大二叉树TreeNode constructMax(int[] nums){ if(nums.length == 0) return null; int maxnum = Integer.MIN_VALUE; int index =0; for(int i=0;i<nums.length;i++){ if (nums[i]>maxnum) maxnum = nums[i]; index=i; } TreeNode root = n

2021-03-25 15:31:27 143

原创 二叉树算法题总结(1)

二叉树算法题总结(1)一.前言树的问题永远逃不开树的递归遍历框架:/* 二叉树遍历框架 */void traverse(TreeNode root) { // 前序遍历,对根节点的操作位置在这里 traverse(root.left) // 中序遍历,对根节点的操作位置在这里 traverse(root.right) // 后序遍历,对根节点的操作位置在这里}二.二叉树的重要性举个例子,经典排序算法:【快速排序】和【归并排序】;快速排序就是个二叉树的前

2021-03-25 10:24:48 186

原创 java中的动态代理和反射

java中的动态代理和反射Java的动态代理是用反射实现的。一.什么是反射?java的反射机制:在运行时刻,对于任何一个类,能够知道它的所有属性和方法;对任意一个对象,都能调用它的任意方法和属性;这种动态获取信息以及动态调用方法的功能称为java的反射机制。举个简单例子:package com.bike;import java.lang.reflect.*;public class Main { public static void main(String[] args) thr

2021-03-24 17:16:13 515

原创 滑动窗口算法详解__java版(与C++的区别注意)

滑动窗口算法详解一. 算法框架滑动窗口算法:int left =0,right =0;while(right<s.size()){ //增大窗口 window.add(s[right]); right++; while(window needs shrink){ //缩小窗口 window.remove(s[left]); left++; }}其实对应的算法思路很简单,主要是细节比较繁琐。 比如如何向窗口添加新元素,如何缩小窗口,在窗口滑动的哪个阶段更新结果。滑动

2021-03-24 16:25:47 441

原创 Java中 BIO vs NIO vs AIO

Java中 BIO vs NIO vs AIO一.前言Java中有阻塞IO、非阻塞IO。阻塞IO可以理解为“一个连接对应于一线程”。非阻塞IO可以理解为“一个请求(一个请求里面可能会有多个连接【长连接短连接】)对应于一线程”。二.BIOBIO也称为同步阻塞IO。同步阻塞IO模式下,服务器实现模式为一个连接对应一个线程,即:有连接请求从客户端发起时,服务器端就需要创建一个线程进行处理,如果有大量连接时,服务器就需要创建大量线程进行处理。当然这可以通过线程池机制来改善。阻塞IO适用场景为: 连接数较

2021-03-23 23:00:10 178

原创 二分查找方法详解

二分查找方法详解一.二分查找框架int binarySearch(int[] nums,int target){ int left = 0,right = ...; while(...){ int mid = left +(right - left)/2; if(nums[mid] == target){ ... } else if (nums[mid] <target){ left = ...; } else if (nums[mid]>target

2021-03-23 22:27:53 223

原创 String vs StringBuilder vs StringBuffer(底层实现)

String vs StringBuilder vs StringBuffer(底层实现)一.搞懂字符串常量池细节常量池是java的一项技术,8种基础数据类型除了float和double都实现了常量池技术。即,把经常用到的数据存放在某块内存中,避免频繁的数据创建与销毁。字符串常量池是Java常量池技术的一种实现,在较新的JDK版本中,字符串常量池被实现在Java堆内存中。对字符串常量池建立初步认识:public static void main(String[] args){ String s1

2021-03-23 20:49:47 309 1

原创 BFS算法框架详解

BFS算法框架详解DFS就是回溯算法,BFS的核心思想就是把一些问题抽象成图,从一个点开始,向四周开始扩散。BFS相对DFS最主要的区别是:BFS找到的路径一定是最短的,但代价就是空间复杂度比DFS大很多。本文主要讲解两道BFS相关的题目,分别是【二叉树的最小高度】和【打开密码锁的最少步数】。一.算法框架BFS问题的本质是让你在一副图中**找到从起点start到终点target的最近距离**。BFS的框架如下://计算从起点start到终点target的最近距离int BFS<Node

2021-03-22 21:17:18 1806 1

原创 2021-03-22

回溯算法详解一.介绍解决一个回溯问题,实际上就是一个决策树的遍历过程。只需要思考3个问题:1.路径: 也就是已经做出的选择。2.选择列表: 也就是你当前可以做的选择。3.结束条件: 也就是达到决策树底层,无法再做选择的条件。后面会通过全排列和N皇后问题来加深理解。回溯算法的基本框架:int[] result=new int [n+1];backtrack(路径,选择列表){ if 满足结束条件: result.add(路径); return; for 选择 in 选择列表{

2021-03-22 11:37:30 55

原创 解题思路——动态规划详解

解题思路——动态规划详解一. 介绍动态规划问题的一般形式就是求最值,既然是要求最值,核心问题是:穷举 因为要求最值,肯定要把所有可行的答案穷举出来,然后在其中找最值。但这个穷举有点特别, 因为这类问题存在【重叠子问题】,如果暴力穷举的话效率会极其低下,所以需要备忘录 或者DP table 来优化穷举过程,避免不必要的计算。动态规划问题一定具备【最优子结构】,才能通过子问题的最值得到原问题的最值。虽然其核心是穷举求最值,但问题是千变万化的,想要穷举出所有可行解不容易,只有列出正确的转移方程才能正确穷

2021-03-21 23:03:52 163

原创 ECCV2020 语义分割任务的成员推理攻击和防御

ECCV2020 语义分割任务的成员推理攻击和防御论文地址:论文链接代码地址:github链接一.概要大型数据集推动了当今用于语义分割的最先进方法的成功。数据被认为是需要保护的重要资产,因为此类数据集的收集和注释需要大量的工作和相关的成本。此外,视觉数据可能包含私人或敏感信息,这使其不适合公开发布。不幸的是,最近在更广泛的对抗性机器学习领域中的成员推理和对机器学习模型的推理攻击方面的研究表明,即使是黑匣子分类器,也会在经过训练的数据集上泄漏信息。我们证明了这种隶属推理攻击可以在复杂,最新的语义分割模

2021-03-20 12:22:38 1384

原创 2021-03-10 剑指offer59 -II. 队列的最大值

剑指offer59 -II. 队列的最大值一.题目请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value 需要返回 -1...

2021-03-12 10:24:28 77

原创 2021-3-11 剑指offer65 不用加减乘除做加法

剑指offer65 不用加减乘除做加法一. 题目写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。示例:输入: a = 1, b = 1输出: 2提示:a, b 均可能是负数或 0结果不会溢出 32 位整数二. 解题思路本题考查对位运算的灵活使用,即使用位运算实现加法。设两数字的二进制形式a,b,其求和 s=a+b,a(i)代表a的二进制第i位,则分为以下四种情况:观察发现,无进位和与异或运算规律相同,进位和与运算规律相同(并需左

2021-03-12 00:27:36 65

原创 2021-03-10 剑指offer59 -I. 滑动窗口的最大值

剑指offer59 -II. 队列的最大值一.题目请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value 需要返回 -1...

2021-03-11 10:46:26 58

原创 2021-03-09 剑指offer66.构建乘积数组

剑指offer66.构建乘积数组一.题目给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B[i] 的值是数组 A 中除了下标 i 以外的元素的积, 即 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。示例:输入: [1,2,3,4,5]输出: [120,60,40,30,24]提示:所有元素乘积之和不会溢出 32 位整数a.length <= 100000二.解题思路2.1 自己的解法—暴力解法

2021-03-10 09:50:54 90

原创 高效的基于决策的黑盒攻击方法HSJA:HopSkipJumpAttack: A Query-Efficient Decision-Based Attack

高效的基于决策的黑盒攻击方法HSJA:HopSkipJumpAttack: A Query-Efficient Decision-Based Attack目录高效的基于决策的黑盒攻击方法HSJA:HopSkipJumpAttack: A Query-Efficient Decision-Based Attack一.介绍二.方法2.1 优化框架2.2 对于l2距离的一个迭代算法2.3 扩展到L∞距...

2020-04-10 23:26:02 6523 2

原创 黑盒边界攻击:SIGN-OPT: A QUERY-EFFICIENT HARD-LABEL ADVERSARIAL ATTACK-ICLR 2020

黑盒边界攻击:SIGN-OPT: A QUERY-EFFICIENT HARD-LABEL ADVERSARIAL ATTACK-ICLR 2020@[TOC]目录

2020-03-31 10:48:47 3334 2

原创 可解释的对抗训练网络模型:Interpreting Adversarially Trained Convolutional Neural Networks-ICML 2019

可解释的对抗训练网络:Interpreting Adversarially Trained Convolutional Neural Networks-ICML 2019前言 最近在考虑做对抗样本可解释性方面的研究,之前没有接触过。今天要分享的这篇文章发表在ICML 2019上,我在实验室的组会中也进行了分享,因此接下来,将通过文字结合PPT的形式将内容分享给大家。一.背景 在...

2020-03-30 11:47:04 2838 1

原创 Nature子刊《communications biology》——利用深度学习技术通过背部图像对脊柱侧弯情况筛查

一.摘要青少年特发性脊柱侧弯是青少年中最常见的脊柱疾病,全世界的患病率为0.5–5.2%。 脊柱侧弯筛查的传统方法很容易获得,但由于其较低的阳性预测值,因此需要不必要的转诊和放射线照相。 深度学习算法的应用具有减少脊柱侧弯筛查中不必要的转诊和成本的潜力。 在这里,我们开发并验证了深度学习算法,该算法可使用裸露的背部图像进行自动脊柱侧凸筛查。 该算法的准确性在检测脊柱侧弯,检测曲线≥20°的病例以...

2019-12-17 09:12:55 5203 17

原创 跑深度学习实验-shell脚本,tmux,pycharm小技巧

最近项目组开始进入写论文的阶段,开始疯狂做实验了,不像之前的只是做一两组实验看效果,现在光数据集就准备了4种,要跑的实验也多起来了,把最近学到的跑实验的小技巧总结一下,以后记得使用。1.写一个shell脚本跑实验使用shell脚本跑实验的好处就是可以通过一个文件就把好几组的测试组跑完,不需要每过几十分钟就去看一下,跑新的实验,弄的人很烦躁。具体怎么使用shell脚本来跑实验呢?以我目前跑的音频...

2019-12-06 11:28:39 3760 1

原创 论文分享(四)——NIPS 2019 Adversarial Music: Real World Audio Adversary Against Wake-word Detection System

摘要论文的重点是针对唤醒词检测系统提出的攻击方法,通过一些无法察觉的背景音乐干扰使得VAs(语音助手)无效,当存在对抗音频时。论文模拟实现了Amazon Alexa的唤醒检测系统,根据从现实世界收集的数百种语言样本,验证了所提出的对抗音频样本的有效性。实验表明,可以显著地将所模拟的唤醒检测模型的F1分数从93.4%降到11.0%,最后,还测试了在空气中的音频对抗样本,同样有效的将F1分数从92....

2019-11-29 22:56:14 601

原创 tensorflow框架精细讲解(一)

前言大四的时候大致的看过一本基于tensorflow的实战Google深度学习框架的书,目前看论文源码也好,修改代码做改进也好,很多基本知识还是源于那个时候。这是远远不够的,为此,我在github上找了一个基于tensorflow的实例管理教程,来再细致的学习一下tensorflow,希望能够增强自己读代码,写代码的能力,对深度学习也有更好的理解。一.数据准备具体的学习过程,因为有之前的一些...

2019-11-26 13:57:26 738

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除