首页 文章 精选 留言 我的

精选列表

搜索[国密算法],共10000篇文章
优秀的个人博客,低调大师

经典算法详解(11)递归查找数组中的最大值

题目:编写一个程序,用递归的方法实现查找数组中的最大值。 C++实现 1 #include<iostream> 2 3 using namespace std; 4 //第一种方法是常规方法,不是使用递归,首先将第一个元素的值赋值给max,然后遍历数组, 5 //当遇到超高max的值时将其赋值给max,最后就将得到最大值 6 int getMax_fir(int *arr,int n) { 7 int max = arr[0]; 8 for (int i = 1; i < n; i++) { 9 if (max < arr[i]) 10 max = arr[i]; 11 } 12 return max; 13 } 14 15 //第二种方法是使用递归,递归就是讲大规模问题转成小规模的相同问题,将数组看成第一个元素与后面的数组的最大值作比较, 16 //后面的数组求最大值又可以看成它的第一个元素与后面的数组最大值比大小,以此类推性,形成递归 17 int getMax_sec(int *arr, int n) { 18 if (n == 1) //设置终止条件 19 return arr[0]; 20 int tem = getMax_sec(arr + 1, n - 1); //指针加一表示下一个元素开始 21 if (arr[0] > tem) 22 return arr[0]; 23 else 24 return tem; 25 } 26 27 int main(int argc, char *argv[]) { 28 int arr[10] = { 2,4,5,65,2,8,2,5,6,55 }; 29 cout << getMax_fir(arr, 10) << endl; 30 cout << getMax_sec(arr, 10)<<endl; 31 getchar(); 32 return 0; 33 } 说明: (1)第一种方法是常规方法,不是使用递归,首先将第一个元素的值赋值给max,然后遍历数组,当遇到超高max的值时将其赋值给max,最后就将得到最大值。 (2)第二种方法是使用递归,递归就是讲大规模问题转成小规模的相同问题,将数组看成第一个元素与后面的数组的最大值作比较,后面的数组求最大值又可以看成它的第一个元素与后面的数组最大值比大小,以此类推性,形成递归。第二种方法符合题目要求。

优秀的个人博客,低调大师

leetcode算法题解(Java版)-17-图的巧妙用法

一、图 题目描述 Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses. For example, given n = 3, a solution set is: "((()))", "(()())", "(())()", "()(())", "()()()" 思路 看到一个非常有意思的思路,是用图来解释的。值得借鉴。 关键:当前位置的左括号数目<右括号 图:节点:当前位置的左括号和右括号数目即为(x,y)(x>=y)边:从(x,y)->(x+1,y),(x,y)->(x,y+1)注意当x==y时,不存在(x,y)->(x,y+1)这条边 解:从(0,0)出发到(n,n)的全部路径。 上面是大神的思路,敲完后,总结一下:题目要求的是各种输出结果,这种题以后可以往图上考虑考虑。找出题目中的隐含的限制条件作为边界条件,然后确定好当前的状态也就是节点,再确定这个节点到下一个节点的路径,也就是边。 代码 import java.util.ArrayList; public class Solution { public ArrayList<String> generateParenthesis(int n) { ArrayList<String> list = new ArrayList<String>(); help(n,0,0,"",list); return list; } public void help(int n,int x,int y,String tem,ArrayList<String> list){ if(y==n){ list.add(tem); } if(x<n){ help(n,x+1,y,tem+'(',list); } if(x>y){ help(n,x,y+1,tem+')',list); } } } 二、链表 题目描述 Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists. 思路 题目意思感觉没说明白,意思就是把两个有序的链表合并(splice)到一起组成一个有序链表。 开一个空的头节点,或者头指针,搞不清楚。反正明白意思就好,头节点里面不放数值。然后就是循环比较各个节点大小,依次加入新建的链表中。 代码 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */ public class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode head = new ListNode(0); ListNode p = head; while(l1!=null&&l2!=null){ if(l1.val<l2.val){ p.next = l1; l1 = l1.next; } else{ p.next = l2; l2 = l2.next; } p = p.next; } if(l1 == null){ p.next = l2; } if(l2 == null){ p.next = l1; } return head.next; } } 三、动态规划 题目描述 Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path. Note: You can only move either down or right at any point in time. 思路 动态规划,老套路,求什么我们就把以什么作为状态数组dp,同样的,先来一个空间复杂度为m*n的,然后再考虑优化空间。 代码 //空间复杂度m*n public class Solution { public int minPathSum(int[][] grid) { int m = grid.length; int n = grid[0].length; if(grid == null){ return 0; } for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(i==0&&j>0){ grid[i][j]+=grid[i][j-1]; } if(j==0&&i>0){ grid[i][j]+=grid[i-1][j]; } if(i*j!=0){ grid[i][j]+=Math.min(grid[i-1][j],grid[i][j-1]); } } } return grid[m-1][n-1]; } } import java.util.Arrays; public class Solution { public int minPathSum(int[][] grid) { if(grid == null){ return 0; } int m = grid.length; int n = grid[0].length; int [] dp = new int [n+1]; Arrays.fill(dp,Integer.MAX_VALUE); dp[1]=0;//dp[0]空出来,方便操作 for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ //注意这里dp数组中下标从1开始 //dp[j]表示空间复杂度为m*n的代码中的grid[i][j-1] //dp[j+1]表示grid[i-1][j] dp[j+1]=Math.min(dp[j],dp[j+1])+grid[i][j]; } } return dp[n]; } }

优秀的个人博客,低调大师

leetcode算法题解(Java版)-16-动态规划(单词包含问题)

一、递归 题目描述 Given two binary trees, write a function to check if they are equal or not. Two binary trees are considered equal if they are structurally identical and the nodes have the same value. 思路 碰到二叉树的问题,差不多就是深搜、广搜,递归那方面想想了,当然如果要考虑一下空间、时间,还需要进行剪枝和压缩处理。这题比较简单:判断两个树是否相等,可以递归的判断子树是否相等,最后找到边界条件就是是否都为空,都不为空时节点里面的值是否相等。 代码 /** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public boolean isSameTree(TreeNode p, TreeNode q) { if(p==null&&q==null){ return true; } else if(p==null||q==null){ return false; } else if(q.val!=p.val){ return false; } else{ return isSameTree(p.left,q.left)&&isSameTree(p.right,q.right); } } } 二、动态规划 题目描述 Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words. For example, givens ="leetcode",dict =["leet", "code"]. Return true because"leetcode"can be segmented as"leet code". 思路 dp的题目,写了几道了。核心无非就是确定dp数组和状态转移方程。这几道题都有明显的特点,那就是dp数组记录的就是所求的答案,所以答案一般都是dp[s.length()]这种形式的。 有了上面的总结,再来看着道题目。要求一串字母是否可以由所给的字典中的单词拼出来,要求返回布尔型。那好,也同时提示我们了dp数组就是记录它的子串是否能满足要求,类型是布尔型:dp[i]表示的是s[0,i-1]这个子串能否满足要求。 dp[i]=dp[j]&&s[j,i]是否在字典中(0<=j<=i-1) 代码 import java.util.Set; public class Solution { public boolean wordBreak(String s, Set<String> dict) { if(s==null||s.length()==0||dict==null||dict.size()==0){ return false; } boolean [] dp = new boolean [s.length()+2]; dp[0] = true; for(int i=1;i<=s.length();i++){ for(int j=i-1;j>=0;j--){//从尾部扫描单词 if(dp[j]==true&&dict.contains(s.substring(j,i))){ dp[i]=true; break; } else{ dp[i]=false; } } } return dp[s.length()]; } } 三、深搜 题目描述 Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word. Return all such possible sentences. For example, givens ="catsanddog",dict =["cat", "cats", "and", "sand", "dog"]. A solution is["cats and dog", "cat sand dog"]. 思路 题目是上一道题的加强版,为了考察动态规划。感觉有点复杂,没想出来怎么在上一道的基础上改进。 深搜可以解决问题!直接看代码了 代码 import java.util.ArrayList; import java.util.Set; public class Solution { public ArrayList<String> res = new ArrayList<>(); public ArrayList<String> wordBreak(String s, Set<String> dict) { dfs(s,s.length(),dict,""); return res; } public void dfs(String s,int index,Set<String> dict,String temp){ if(index==0){ if(temp.length()>0){ res.add(temp.substring(0,temp.length()-1));//如果写成res.add(temp)则末尾会多一个空格,小细节 } } for(int i=index-1;i>=0;i--){ if(dict.contains(s.substring(i,index))){ dfs(s,i,dict,s.substring(i,index)+" "+temp); } } } }

优秀的个人博客,低调大师

Josephus Problem的详细算法及其Python, Java语言的实现

笔者昨天看电视,偶尔看到一集讲述古罗马人与犹太人的战争——马萨达战争,深为震撼,有兴趣的同学可以移步:http://finance.ifeng.com/a/20170627/15491157_0.shtml . 这不仅让笔者想起以前在学数据结构时碰到的Josephus问题: 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人找到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。 以前我们都是用链表的方法编程来解决这个问题的,这次笔者将会讲述两个不同的方法,一个是笔者自己的朴素想法,一个是数学方法。 朴素方法 数学方法 首先我们先将Josephus问题描述出来,即: 共有N个人围成一圈,编号分别为1,2,…,N,从第一个人开始从1到m报数,报到m的人退出,如此循环下去,直至最后一个人。问最后一个人的最开始的编号是几? 先是笔者的朴素想法。 将N个人储存在列表(list)中,每次报到m的元素剔除,并记录下最后一个人报的数i,然后将缩短后的数组从i+1报数,如此循环下去,直至列表的长度为1,这样剩下来的元素就是我们要求的答案。 这种想法虽然素朴,比较容易实现,但是时间复杂度为O(Nm). 接着是数学方法。 假设一开始的Josephus环编号为0,1,2,…,N-1.我们知道第一个人(编号一定是m%N-1) 出列之后,剩下的N-1个人组成了一个新的Josephus环(以编号为k=m%n的人开始): k,k+1,k+2,......,n−2,n−1,0,1,2,...k−2k,k+1,k+2,......,n−2,n−1,0,1,2,...k−2 并且从k开始报0. 现在我们把他们的编号做一下转换: k−−>0k+1−−>1k+2−−>2...k−2−−>n−2k−1−−>n−1k−−>0k+1−−>1k+2−−>2...k−2−−>n−2k−1−−>n−1 变换后就成为了(N-1)个人报数的子问题,这启示我们可以用归纳法来解决这个问题。假如我们知道这个子问题的解为xx,原来问题的答案为x′x′,则x′=(x+k)%n.x′=(x+k)%n.因此,递推公式就有了!令f(i)f(i)表示ii个人玩游戏报mm退出最后胜利者的编号,我们要求的结果是f(N)f(N),其递推公式如下: f(1)=0f(i)=(f(i−1)+m)%i(i>1)f(1)=0f(i)=(f(i−1)+m)%i(i>1) 数学方法简单明了,计算效率高,但是推导比较困难。 最后,我们给出以下两种方法的Python代码和朴素方法的Java代码,希望能给大家一点思考。 完整的Python代码如下: # -*- coding: utf-8 -*- # This code is devoted to solve the Josephus Problem by Python. # N: numper of people # m: cycle number def solve1(N, m): a = list(range(1, N+1)) # sequence end = 0 # the number of last man in sequence while len(a) > 1: b = [] for i in a: if not (end+a.index(i)+1)%m: b.append(i) # print(i, end=' ') # print the order of removing if a.index(i) == len(a)-1: # last man of sequence end = (end+a.index(i)+1)%m # remove elements in b from a for i in b: a.remove(i) return a[0] # solve the problem by math method def solve2(N, m): return 0 if N == 1 else (solve2(N-1, m)+m)%N # main function for execution def main(): N, m = 41, 3 left1 = solve1(N, m) print('\nThe man left: %d' %left1) left2 = solve2(N, m)+1 print('\nThe man left: %d' % left2) main() 完整的Java代码如下: import java.util.ArrayList; public class Josephus { public static void main(String[] args) { int N = 41; int m = 3; int left = solve(N, m); System.out.println("\nThe man left is "+left+"."); } public static int solve(int N, int m) { ArrayList<Integer> a = new ArrayList<Integer>(); int end = 0; for(int i=0; i < N; i++) a.add(i+1); while(a.size() > 1) { ArrayList<Integer> b = new ArrayList<Integer>(); for(int i: a) { if ((end+a.indexOf(i)+1)%m == 0) b.add(i); // System.out.print(i+"-->"); if(a.indexOf(i) == a.size()-1) end = (end+a.indexOf(i)+1)%m; } for(Object i: b) { a.remove(i); } } return a.get(0); } } 本次分享到此结束,欢迎大家交流~~

优秀的个人博客,低调大师

全球首个时尚AI算法大赛开启 让机器更懂美

当时尚遇上科技!3月12日,阿里巴巴人工智能开启跨界新篇章——联合香港理工大学纺织及制衣学系(以下简称:香港理工大学ITC)、英国纺织协会共同发起2018 FashionAI全球挑战赛,并发布业界首个同时满足服饰专业性和机器学习要求的大规模高质量数据集,号召全世界的AI科研人才一起关注机器认知时尚的基础问题,共同推动AI 技术在时尚产业的落地。 时尚牵手科技早已成为当下潮流趋势,但人工智能在时尚产业的商业化落地却困难重重。 “这是因为时尚是一件很主观的事情,我们需要用严谨的科学态度去看待主观的时尚。”本次大赛的主办方阿里巴巴“图像和美”团队负责人雷音表示,在多年的技术研发过程中,其团队发现,服饰关键点定位和服饰属性标签识别,是建构AI在服饰应用的两个基础问题,也是本次FashionAI大赛的两个赛题。“时尚行业的市场潜力很大,但想让科

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册