长度

删除排序数组中的重复数组——移除元素

醉酒当歌 提交于 2020-03-17 02:06:14
26. 删除排序数组中的重复项 给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 示例 1: 给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 你不需要考虑数组中超出新长度后面的元素。 示例 2: 给定 nums = [0,0,1,1,1,2,2,3,3,4], 函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。 你不需要考虑数组中超出新长度后面的元素。 1 public class T26 { 2 public int removeDuplicates(int[] nums) { 3 int slow = 0, fast = 1; 4 int count = 1; 5 while (fast < nums.length) { 6 if (nums[slow] == nums[fast]) { 7 fast++; 8 } else { 9 nums[slow + 1] = nums[fast]; 10 slow++; 11 count++; 12 } 13 } 14 return count; 15 } 16

需要排序的最短子数组长度

大兔子大兔子 提交于 2020-03-16 04:01:40
题目: 给定一个无序数组,求出需要排序的最短子数组的长度。 例如:arr={1,5,3,4,2,6,7}返回4,因为只有[5,3,4,2]需要排序。 思路:   解决这个问题可以在时间复杂度为O(N)、额外空间复杂度为O(1)完成。   初始化变量noMinIndex=-1,从右向左遍历,便利的过程记录右侧出现过的数的最小值,记为min。假设当前数为arr[i],如果arr[i]>min,说明如果要整体有序,min值必然会移到arr[i]的左边。用noMinIndex记录最左边出现这种情况的位置。如果遍历完成后,noMinIndex的值依然为-1,说明从右向左始终不升序,原数组本来就有序,直接返回0,即完全不需要排序。   接下来从左向右遍历,遍历的过程记录左侧出现过的数的最大值。记为max。假设当前数为arr[i],如果arr[i] 程序实现 /* 给定一个无序数组,求出需要排序的最短子数组的长度。 例如:arr={1,5,3,4,2,6,7}返回4,因为只有[5,3,4,2]需要排序。 */ #include<iostream> using namespace std; int getMinLength(int *arr,int len) { if (len < 2) return 0; int min = arr[len - 1]; int noMinIndex = -1;

哈夫曼树的长度

ε祈祈猫儿з 提交于 2020-03-12 13:57:06
哈夫曼树的长度 哈夫曼树也称最优二叉树,最优指的是其带权路径和最小,而哈夫曼树的长度也指的是其带权路径和。 一般而言,求其长度时,应当将其按照构造的方式进行构造之后,计算每个叶节点的值乘以权重之后的和。 在这个图中,绿色的节点即叶子节点,故此树的长度WPL为 W P L = 1 × 3 + 2 × 3 + 3 × 2 + 3 × 2 + 4 × 2 = 29 WPL = 1\times 3 + 2 \times 3 + 3\times 2+3\times 2 + 4\times 2 = 29 W P L = 1 × 3 + 2 × 3 + 3 × 2 + 3 × 2 + 4 × 2 = 2 9 当然,这样一来,代码的实现难度就很大了,不但要构造哈夫曼树(自下而上),而且要再重新确定叶节点的路径(自上而下)。 另一种思路,利用其特性解决。 先说结论: 带权路径和WPL值等于非叶子节点的值的和。 在此图中树的长度WPL为: W P L = 3 + 6 + 13 + 7 = 29 WPL = 3+6+13+7=29 W P L = 3 + 6 + 1 3 + 7 = 2 9 是不是方便许多? 以下是个人的理解,并非严谨推导。 以叶节点A举例,按公式(1)的计算方式中,A乘以了2,也可以理解为A被加了两次。第一次的值加在其父节点7上,第二次值加在根节点13上。而用公式(2)计算的过程

从LeetCode学算法(2):获取无重复字符的最长子串

橙三吉。 提交于 2020-03-12 03:45:46
题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度 示例: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 算法分析 (1)遍历字符串中的每个字符,将每次遍历的字符赋予一个新的字符串,每次循环先判断该新字符串中无重复的字符个数是否等于该新字符串的长度,若相等,则说明该新字符串的所有字符都是不重复的,则另该字符串长度为所求字串长度,直到遍历结束; (2)否则,一旦出现了重复的字符,则切割一个新的字符串,重复上面的步骤 程序如下: public class Solution { public int LengthOfLongestSubstring(string s) { var length = 0; string sub = ""; foreach (var c in s) { sub += c; var count = sub.Length; if (sub.Distinct().Count() == count) { if (count >= length) length = count; } else { var lastIndex = sub.IndexOf(c); sub = sub.Substring(lastIndex + 1); } } return length; } } 来源:

js计算二叉树直径长度

被刻印的时光 ゝ 提交于 2020-03-10 20:09:40
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过根结点。 示例 : 给定二叉树 1 / \ 2 3 / \ 4 5 返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。 注意:两结点之间的路径长度是以它们之间边的数目表示。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/diameter-of-binary-tree /** * Definition for a binary tree node. * function TreeNode(val) { * this.val = val; * this.left = this.right = null; * } */ /** * @param {TreeNode} root * @return {number} */ var diameterOfBinaryTree = function(root) { function helper(node) { if (node === null) return 0; let left = helper(node.left), right = helper(node.right); height = Math.max(left + right, height

[SCOI2005]栅栏(搜索,二分)

南笙酒味 提交于 2020-03-09 08:27:27
[SCOI2005]栅栏(luogu) Solution 有一个贪心策略——尽量满足较小的需要的木板 于是可以先将需要的木板从小到大排序,二分出最多能满足前多少块木板 有减小二分区间的策略——提供的木块总长度必须 >= 所有要满足的木板的总长度 如何check呢? 考虑暴力思想——搜索,按需要满足的木板顺序搜索 但肯定需要剪枝 剪枝1:提供的木块总长度-当前已舍弃的长度 > = 所有要满足的木板的总长度 剪枝2:及时舍弃不能满足任何木板的 提供的木板 Code #include <cstdio> #include <cstdlib> #include <algorithm> using namespace std; const int M=51,N=1001; int a[M],b[N],n,m,tot,ma,t,sum,s[N],fa[M]; bool dfs(int k,int x,int mid) { if(k<=0) return 1; if(sum-t<s[mid]) return 0; for(int i=x;i<=m;i++) if(fa[i]>=b[k]) { fa[i]-=b[k]; if(fa[i]<b[1]) t+=fa[i]; if(b[k]==b[k-1]) { if(dfs(k-1,i,mid)) return 1; } else if(dfs(k-1

C/C++中获取数组的长度

試著忘記壹切 提交于 2020-03-07 08:46:46
C/C++中没有提供直接获取数组长度的函数。 对于存放字符串的字符数组,可用strlen函数获取长度 。 如:char a[]="hello world";int count = strlen(a); 对于其他类型的数组,可使用sizeof(array)/sizeof(array[0]),计算长度。 在C中,可在使用时把它定义成宏, #define GET_ARRAY_LENGTH(array,len){len=(sizeof(array)/sizeof(array[0]));} 在C++中,可使用模板技术,定义这个函数, 需要将数组参数作为引用类型传递,否则数组名称会退化为一个指针 ,这样就无法计算数组的大小sizeof(a)。 template<class T> int GetArrayLen(T& a) { return sizeof(a)/sizeof(a[0]); } 对于存放字符串的字符数组,也可以使用这种方法来计算长度,但是计算后的值需要减去1, 即sizeof(a)/sizeof(a[0])-1,因为字符串默认带有结束符号'\0' 使用示例如下: C语言: #include<stdio.h> #define GET_ARRAY_LENGTH(array,len){len=(sizeof(array)/sizeof(array[0]));} int main() {

根据三条边的长度在线生成三角形(generate triangles by edge lengths)

旧巷老猫 提交于 2020-03-05 20:55:13
网址: https://www.geogebra.org/m/JHgTXKrt 方法: 鼠标拖放端点可以改变端点的长度和位置。 网址: https://www.mathwarehouse.com/triangle-calculator/online.php 方法: 输入三条边的长度,生成三角形。 来源: https://www.cnblogs.com/emanlee/p/12422307.html

零长度数组

做~自己de王妃 提交于 2020-02-29 19:40:08
在结构体定义中遇到了长度为 0 的数组,它的作用是什么呢?写下面的代码进行测试。 代码 #include <iostream> using namespace std; struct Info { int num; char zero_array[0]; }; int main() { struct Info info; cout << "Struct Start Address:" << &info << endl; cout << "Struct End Address:" << &info.zero_array << endl; return 0; } 结果为 Struct Start Address:0x7fff87553bf0 Struct End Address:0x7fff87553bf4 End Address 刚好比 Start Address 多出一个 int 的长度。 它可以指示结构体结束时的地址。 作用 我们可以动态地在 Info 结构体中扩充内容 int main() { struct Info info; cout << "Struct Start Address:" << &info << endl; cout << "Struct End Address:" << &info.zero_array << endl; info.zero_array[0