将数组首尾元素接在一起,就是串联值。
串联之后删除,如果只剩下一个元素,加上这个元素即可
双指针,从首和尾向中间移动即可
注意:用 long
没看题目用了 int wa了一发
class Solution {
public long findTheArrayConcVal(int[] nums) {
int n = nums.length;
int l = 0, r = n - 1;
long ans = 0;
while (l < r) {
String s = "";
s += nums[l++];
s += nums[r--];
ans += Integer.parseInt(s);
}
if (l == r) ans += nums[l];
return ans;
}
}
给定 lower 和 upper 找到 数组中 两个不同的数字,如果满足 lower <= nums[i] + nums[j] <= upper 就是一组公平数对。
求公平数对的个数
我们枚举每个 nums[i] 将 lower <= nums[i] + nums[j] <= upper 变形为:lower - nums[i] <= nums[j] <= upper - nums[i]
所以我们二分找到 第一个大于 upper - nums[i] 的位置,和 第一个 大于等于 lower- nums[i] 的位置前者减去后者即可得到差。
对应的 c++中的函数就是 uppper_bound 和 lower_bound,Java中么有这俩函数,我们自己写一个
并且,我们求的是数对,有重复的,为防止重复,我们只搜索下标为 i 的数的 左边的数,也避免了 i 被统计进去的情况
class Solution {
public long countFairPairs(int[] nums, int lower, int upper) {
long ans = 0;
int n = nums.length;
Arrays.sort(nums);
// lower <= nums[i] + nums[j] <= upper
// 枚举 nums[i] 找 j
// lower - nums[i] <= nums[j] <= upper - nums[i]
for (int i = 0; i < n; i++) {
int a = i, b = i;
// upper_bound
int l = 0, r = i - 1;
while (l < r) {
int mid = l + r >> 1;
if (nums[mid] > upper - nums[i]) r = mid;
else l = mid + 1;
}
if (nums[l] > upper - nums[i]) a = l;
// a = l;
// if (nums[a] <= upper - nums[i]) a = i;
// lower_bound
l = 0; r = i - 1;
while (l < r) {
int mid = l + r >> 1;
if (nums[mid] >= lower - nums[i]) r = mid;
else l = mid + 1;
}
if (nums[l] >= lower - nums[i]) b = l;
// b = l;
// if (nums[b] < lower - nums[i]) b = i;
ans += a - b;
}
return ans;
}
}
要满足 val ^ firsti == secondi 等号两边同时 ^ first 得到 val = first ^ second
所以我们只要找 queries数组中的 first 和 second 异或值时候存在于 s 中
因为 异或并不会增加二进制位数,0 <= firsti, secondi <= 109,小于 2^30 - 1,最多就 31 位,所以枚举的时候只需要枚举字符串的连续 30 个即可
s 是 1e4 时间复杂度最多就 1e4 * 30 = 3e5 足够的
后面枚举queries是 1e5
时间复杂度 = 4e5
用 map 预处理,存储 s 的二进制子串出现过的 十进制数字,以及对应的 边界 ,要求存储长度最小的子串
class Solution {
public int[][] substringXorQueries(String s, int[][] queries) {
HashMap<Integer, int[]> mp = new HashMap<>();
int n = s.length();
char[] c = s.toCharArray();
for (int i = 0; i < n; i++) {
int x = 0;
for (int j = i; j < i + 30 && j < n; j++) { // 计算子串
x = (x << 1) | (c[j] - '0');
if (!mp.containsKey(x) || (j - i < mp.get(x)[1] - mp.get(x)[0])) {
mp.put(x, new int[]{i, j});
}
}
}
ArrayList<int[]> a = new ArrayList<>();
for (var pr : queries) {
int t = pr[0] ^ pr[1];
if (mp.getOrDefault(t, null) != null)
a.add(new int[]{mp.get(t)[0], mp.get(t)[1]});
else
a.add(new int[]{-1, -1});
}
int len = a.size();
int[][] ans = new int[len][2];
for (int i = 0; i < len; i++) {
ans[i] = a.get(i);
}
return ans;
}
}
ValidPalindromeGivenastring,determineifitisapalindrome,consideringonlyalphanumericcharactersandignoringcases. [#125]Example:"Aman,aplan,acanal:Panama"isapalindrome."raceacar"isnotapalindrome.Haveyouconsiderthatthestringmightbeempty?Thisisagoodquestiontoaskduringaninterview.Forthepurposeofthisproblem
前言我们习惯用idea编写、调试代码,在LeetCode上刷题时,如果能够在IDEA编写代码,并且做好代码管理,是一件事半功倍的事情。对于后续复习题目,做笔记也会非常便利。本文目的在于介绍LeetCodeEditor的使用,以及配置工具类,最终目录结构如下:note:放置笔记src:放置代码leetcode.editor.cn:插件LeetCodeEditor自动生成utils:自定义的工具包,可用于自动化输入测试用例,定义题目需要的类(结构体)out:运行测试时自动生成LeetCodeEditorGitHub:https://github.com/shuzijun/leetcode-edit
文章目录问题B:芝华士威士忌和他的小猫咪们代码&注释问题C:愿我的弹雨能熄灭你们的痛苦代码注释问题D:猜糖果游戏代码注释问题E:有趣的次方代码注释问题F:这是一个简单题代码&注释问题G:打印矩阵代码注释问题H:scz的简单考验代码注释问题I:完美区间代码&注释问题J:是狂热的小迷妹一枚吖~代码&注释2022年10月23日周赛ZZULIOJ问题B:芝华士威士忌和他的小猫咪们时间限制:1Sec内存限制:128MB题目描述芝华士威士忌很喜欢带着他的猫咪们一块跑着玩。但是小猫咪们很懒,只有在离他y米以内才愿意和他一块跑。这天他在坐标为x的位置,他想和他的猫咪们一块跑着玩。有n个小猫咪,第i个小猫咪在坐
一、题目给你一个整数数组ranks和一个字符数组suit。你有5张扑克牌,第i张牌大小为ranks[i],花色为suits[i]。下述是从好到坏你可能持有的手牌类型:“Flush”:同花,五张相同花色的扑克牌。“ThreeofaKind”:三条,有3张大小相同的扑克牌。“Pair”:对子,两张大小一样的扑克牌。“HighCard”:高牌,五张大小互不相同的扑克牌。请你返回一个字符串,表示给定的5张牌中,你能组成的最好手牌类型。注意:返回的字符串大小写需与题目描述相同。来源:力扣(LeetCode)链接:https://leetcode.cn/problems/best-poker-hand/d
🍎道阻且长,行则将至。🍓🌻算法,不如说它是一种思考方式🍀算法专栏:👉🏻123一、🌱344.反转字符串题目描述:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解决这一问题。来源:力扣(LeetCode)难度:简单提示:1s[i]都是ASCII码表中的可打印字符示例1:输入:s=[“h”,“e”,“l”,“l”,“o”]输出:[“o”,“l”,“l”,“e”,“h”]示例2:输入:s=[“H”,“a”,“n”,“n”,“a”,“h”]输出:[“h”,“a”,“n”,“n”,“a”,“H”
数据规模->时间复杂度10^8内容二维数组中的路径问题买卖股票的最佳时机lc62【剑指098】【top100】:不同路径https://leetcode.cn/problems/unique-paths/提示:1题目数据保证答案小于等于2*10^9#方案一:dfs+记忆化classSolution:defuniquePaths(self,m:int,n:int)->int:memo=[[-1]*nfor_inrange(m)]defdfs(i,j):ifi==m-1andj==n-1:return1ifi>=morj>=n:return0ifmemo[i][j]!=-1:returnmemo[
🍎道阻且长,行则将至。🍓🌻算法,不如说它是一种思考方式🍀算法专栏:👉🏻123hash是什么,哈希表为什么叫哈希表?一、🌱454.四数相加II题目描述:给你四个整数数组nums1、nums2、nums3和nums4,数组长度都是n,请你计算有多少个元组(i,j,k,l)能满足:0nums1[i]+nums2[j]+nums3[k]+nums4[l]==0来源:力扣(LeetCode)难度:中等提示:n==nums1.lengthn==nums2.lengthn==nums3.lengthn==nums4.length1-2^28示例1:输入:nums1=[1,2],nums2=[-2,-1],n
Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。🌈个人主页:主页链接🌈算法专栏:专栏链接 我会一直往里填充内容哒!🌈LeetCode专栏:专栏链接 目前在刷初级算法的LeetBook。若每日一题当中有力所能及的题目,也会当天做完发出🌈代码仓库:Gitee链接🌈点击关注=收获更多优质内容🌈目录题目:111. 二叉树的最小深度题解:代码实现:题目:700. 二叉搜索树中的搜索题解:代码实现:题目:701. 二叉搜索树中的插入操作题解:代码实现:题目:450. 删除二叉搜索树中的节点题解:代码实现:完结撒花:人生苦短,
👻内容专栏:《LeetCode刷题专栏》🐨本文概括:189.轮转数组🐼本文作者:花碟🐸发布时间:2023.4.12目录思想1暴力求解代码实现:思想2三次倒置代码实现: 思想3memcpy零时拷贝代码实现:189.轮转数组 点击跳转到LeetCode平台OJ页面题目:给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。示例1:输入:nums=[1,2,3,4,5,6,7],k=3输出:[5,6,7,1,2,3,4]解释:向右轮转1步:[7,1,2,3,4,5,6]向右轮转2步:[6,7,1,2,3,4,5]向右轮转3步:[5,6,7,1,2,3,4]
🚀算法题🚀🌲算法刷题专栏|面试必备算法|面试高频算法🍀🌲越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨🌲作者简介:硕风和炜,CSDN-Java领域新星创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎🌲恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻🌲人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯🚀算法题🚀🍔目录🚗知识回顾🚩题目链接⛲题目描述🌟求解思路&实现代码&运行结果⚡动态规划🥦求解思路🥦实现代码🥦运行结果💬共勉🚗知识回顾大家再看这道题目之前,可以先去看一下我之前写过的一篇关于最长递增子序列算法