int函数

数组区间和

安稳与你 提交于 2020-03-09 08:26:48
给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。 示例: 给定 nums = [-2, 0, 3, -5, 2, -1],求和函数为 sumRange() sumRange(0, 2) -> 1 sumRange(2, 5) -> -1 sumRange(0, 5) -> -3 说明: 你可以假设数组不可变。 会多次调用 sumRange 方法 1 public class T303 { 2 private int[] sum; 3 public T303(int[] nums) { 4 sum = new int[nums.length + 1]; 5 for (int i = 0; i < nums.length; i++) { 6 sum[i] = sum[i - 1] + nums[i]; 7 } 8 } 9 10 public int sumRange(int i, int j) { 11 return sum[j + 1] - sum[i]; 12 } 13 } 来源: https://www.cnblogs.com/zzytxl/p/12446618.html

数组中等差递增子区间的个数

核能气质少年 提交于 2020-03-09 08:19:52
如果一个数列至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列。 例如,以下数列为等差数列: 1, 3, 5, 7, 9 7, 7, 7, 7 3, -1, -5, -9 以下数列不是等差数列。 1, 1, 2, 5, 7 数组 A 包含 N 个数,且索引从0开始。数组 A 的一个子数组划分为数组 (P, Q),P 与 Q 是整数且满足 0<=P<Q<N 。 如果满足以下条件,则称子数组(P, Q)为等差数组: 元素 A[P], A[p + 1], ..., A[Q - 1], A[Q] 是等差的。并且 P + 1 < Q 。 函数要返回数组 A 中所有为等差数组的子数组个数。 示例: A = [1, 2, 3, 4] 返回: 3, A 中有三个子等差数组: [1, 2, 3], [2, 3, 4] 以及自身 [1, 2, 3, 4]。 1 public class T413 { 2 public int numberOfArithmeticSlices(int[] A) { 3 if (A == null || A.length < 3) { 4 return 0; 5 } 6 int n = A.length; 7 int[] dp = new int[n]; 8 for (int i = 2; i < n; i++) { 9 if (A[i] - A[i -

问问算法后面的为什么

[亡魂溺海] 提交于 2020-03-09 08:15:31
题目:写一个函数,判断一个数是否是素数 素数是指除了能被1和它本身整数外,不能被其他任何整数整除的数 我们常用的方法就是 :假设输入为k,判断k是否能够被2到根号k之间的数整除,如果能够,则说明不是素数,反之,则是素数 那为什么要 根据 k是否能够被2到根号k之间的数整除 来做判断,这背后的道理逻辑在哪里? 这是我接触C语言的第四年,前面三年我一直都没有弄清楚过,最近的一点感悟就是 多问问自己为什么 比如说 36 是素数 开方等于6 而 36=3 12 36=4 9 36=6*6 36如果写成两个数相乘的形式,一定有一个是<=根号36,有一个是>=根号36,所以只要判断从2-根号36就好了,根号36之后的数一直到36-1,都是对前面乘法的重复 此外,反证法: 设k=a b; 如果存在 a,b>根号k, 则a b>根号k*根号k=k,与已知矛盾, 所以 如果k有除了1和本身以外的其他因子,那一定也在1到根号k里面存在 C代码: # include <stdio.h> # include <math.h> int sushu ( int n ) ; void main ( ) { int n ; scanf ( "%d" , & n ) ; sushu ( n ) ; } int sushu ( int n ) { int i ; for ( i = 2 ; i <= sqrt ( n

java.util.Arrays,java.lang.Math,java.lang.System 类的常用方法汇总

笑着哭i 提交于 2020-03-09 07:45:50
java.util.Arrays类是数组的工具类,一般数组常用的方法包括 二分查找:public static int binarySearch(array[],int key),返回key的下标index 扩容缩容:public static int[] copyOf(array[],newLength),返回新数组 取部分:public static int[] copyOfRange(array[],fromindex,toindex) ,注意[from,to)是开区间,返回新数组 数组从小到大快速排序:public static void Arrays.sort(array[]), 整体赋值:public static void fill(array[],value), 输出为字符串:public static String toString(array[]),返回字符串 检查是否相等:public static boolean equals(array1[],array2[]),返回布尔值 java.lang.Math类是常用的数学类,常用的方法有: 取绝对值:public static int abs(int value),返回绝对值 向上取整:public static int ceil(double value), 向下取整:public static int

二叉树的中序遍历

徘徊边缘 提交于 2020-03-09 05:02:26
文章目录 递归 递归时直接打印 辅助函数 迭代 基于栈的遍历 注 给定一个二叉树,返回它的中序 遍历。 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ 递归 递归时直接打印 public static void inOrderRecur(Node root){ if(root== null) return; inOrderRecur(root.left); System.out.print(root.value + " "); inOrderRecur(root.right); } 辅助函数 时间复杂度:O(n),递归函数T(n)=2*T(n/2)+1 空间复杂度:最坏情况下需要空间O(n),平均情况为O(logn) class Solution { public List<Integer> inorderTraversal(TreeNode root) { List<Integer>list = new ArrayList(); helper(root,

习题4-6 水仙花数 (20分)运行超时解决方法

浪子不回头ぞ 提交于 2020-03-09 04:58:18
# include <stdio.h> # include <stdlib.h> int pow ( int a , int b ) ; int main ( ) { int i , n , temp , ni ; scanf ( "%d" , & n ) ; for ( i = pow ( 10 , n - 1 ) ; i < pow ( 10 , n ) ; i ++ ) { ni = 0 ; temp = i ; while ( temp > 0 ) { ni + = pow ( temp % 10 , n ) ; temp / = 10 ; } if ( ni == i ) { printf ( "%d\n" , i ) ; } } } int pow ( int a , int b ) // 为了解决最大N运行超时问题,这里借鉴了其他文章的方法 自己重写一个pow 不要Math.h里面的pow函数,这样会节约很多时间 { int i , t = a ; for ( i = 1 ; i < b ; i ++ ) a = a * t ; return a ; } 来源: CSDN 作者: hj_cheng29 链接: https://blog.csdn.net/qq_40604352/article/details/104734945

LeetCode 322. 零钱兑换

久未见 提交于 2020-03-09 04:52:37
322. 零钱兑换 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 示例 1: 输入: coins = [1, 2, 5], amount = 11 输出: 3 解释: 11 = 5 + 5 + 1 思路:dp[i]=x表示amount为i至少需要x个硬币,初始化dp[i]=amount+1,然后dp[i] = min(dp[i], dp[i-coin]+1); class Solution { public: int coinChange(vector<int>& coins, int amount) { vector<int> dp(amount+1, amount+1); dp[0] = 0; for(int i=1;i<=amount;i++){ for(int coin: coins){ if (i - coin < 0) continue; dp[i] = min(dp[i], dp[i-coin]+1); } } return dp[amount]==amount+1?-1:dp[amount]; } }; 来源: CSDN 作者: vision泉 链接: https://blog.csdn.net/weixin_38603360/article

算法竞赛进阶指南——后缀数组

允我心安 提交于 2020-03-09 04:47:09
后缀数组 后缀数组 (SA) 是一种重要的数据结构,通常使用倍增或者DC3算法实现,这超出了我们的讨论范围。 在本题中,我们希望使用快排、Hash与二分实现一个简单的O(nlog2n)的后缀数组求法。 详细地说,给定一个长度为 n 的字符串S(下标 0~n-1),我们可以用整数 k(0≤k<n) 表示字符串S的后缀 S(k~n-1)。 把字符串S的所有后缀按照字典序排列,排名为 i 的后缀记为 SA[i]。 额外地,我们考虑排名为 i 的后缀与排名为 i-1 的后缀,把二者的最长公共前缀的长度记为 Height[i]。 我们的任务就是求出SA与Height这两个数组。 输入格式 输入一个字符串,其长度不超过30万。 字符串由小写字母构成。 输出格式 第一行为数组SA,相邻两个整数用1个空格隔开。 第二行为数组Height,相邻两个整数用1个空格隔开,我们规定Height[1]=0。 输入样例: ponoiiipoi 输出样例: 9 4 5 6 2 8 3 1 7 0 0 1 2 1 0 0 2 1 0 2 说实话看到这道题的时候真的是一脸懵,这东西咋用hash,二分,快排。 后来找了些博客看,终于理解其中的思路了, 一、先记录整条的hash值。 二、用一个sort函数,自定义cmp。 三、通过二分确定两个后缀字符之间的前缀相同字母。 这道题写这篇题解的时候又重新去写了一遍

Scala学习笔记03_数组

﹥>﹥吖頭↗ 提交于 2020-03-09 02:02:31
Array Array,长度不可改变的数组,Scala数组的底层实际上是Java数组,如字符串数组在底层就是Java的String[],整数数组在底层就是Java的Int[]。 1 // 数组初始化后,长度就固定下来了,而且元素全部根据其类型初始化 2 scala> val a = new Array [Int]( 10 ) 3 a: Array [Int] = Array ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ) 4 scala> a( 0 )= 1 5 scala> a 6 res7: Array [Int] = Array ( 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ) 7 scala> a( 0 ) 8 res8: Int = 1 9 scala> val a = new Array [ String ]( 10 ) 10 a: Array [ String ] = Array ( null , null , null , null , null , null , null , null , null , null ) 11 scala> a( 1 )= "leo" 12 scala> a 13 res10: Array [ String ] = Array ( null , leo, null

Codeforces Round #618 (Div. 2)

谁说胖子不能爱 提交于 2020-03-09 01:19:40
QAQ : 我太难了 A. Even But Not Even 题意: 给你一个长度为 n 的数组 a, 你可把其中一个数的值加一,这个操作你可以做无数次,要求最后的数组之和不等于零,数组之积不等于 0 ,输出所需最小的操作数。 思路: 暴力模拟即可,要求数组中不能有 0 ,和不等于 0 。 代码: #include <bits/stdc++.h> using namespace std; int num[105]; int main() { int T; scanf("%d",&T); while(T--) { int n; cin >> n; int sum = 0,ans = 0; for(int i = 0;i<n;++i) { cin >> num[i]; if(num[i]==0) { ans++; sum+=1; } else { sum+=num[i]; } } if(sum!=0) printf("%d\n",ans); else printf("%d\n",ans+1); } return 0; } B. Array Sharpening 题意: 给你一个数组 n,n 保证是个偶数,将这两个数组划分为等大小的两个数组,使这两个数组中位数之差的绝对值最小。输出这个最小值。 思路: 将数组从小到大排序,答案就是位于中间的两个数差的绝对值。 代码: #include