涉及数组奇数位、偶数位的问题&&数据终极状态问题

有一类问题很巧,这类问题涉及到在原数组的奇数位、偶数位之间来回移动数据,类似题目有力扣893. Groups of Special-Equivalent Strings力扣1217. Minimum Cost to Move Chips to The Same Position
巧在什么地方呢,先看1217题,这道题说的是,每个位置上都有一些物品,而每个物品移动一个位置,代价是1,移动两个位置,代价是0。也就是说,i位置上的物品,移动到i+2或者i-2位置上时,是不需要任何代价的,当然前提是,数组不越界。也就是说奇数位置i上的物品移动到任意一个奇数位置j上,是不需要代价。任意一个偶数位置q上的物品移动到任意一个偶数位置p上,也是不需要花费任何代价。
不用真的去模拟移动的过程。可以直接遍历数组,得到奇数位置上的物品数量oddcnt,以及偶数位置上的物品数evencnt。因为肯定可以通过一系列移动,将oddcnt数量的物品与evencnt数量的物品,不花费任何代价就能靠在一起,再选择两者之间娇小的一个,将减少的那部分物品移动到有较多物品的那一摞。花费的代价最小是min(evevcnt,oddcnt)。
可以看到,并不用真正的模拟数据,直接就可以得到答案。
再看893题。这个题更有意思。
题目说,对于一个string 类数组 arr中的任意一个元素比如说arr[0],可以将其奇数位置、偶数位置上的元素移动若干次,如果,与arr中任意别的元素相同,则,这两个string是一组,请问该arr数组一共有几组。自己可以和自己是一组。
这涉及到在一个数组元素中移动奇数位置、偶数位置上的元素。这类问题可以自成一类。本题可以直接将一个string元素,即arr[i]的奇数位置上和偶数位置上的字符摘出来,单独形成字符串,再使用sort排序,这样,如果,有两个string是这样的一组字符串,则,相同操作之后,这两个串的形成的奇数位置、偶数位置上的元素的排序子串是相同的。
总之,一旦涉及到数组奇数位置、偶数位置上的问题,可以单独讨论奇数位置元素与偶数位置元素。

2021/1/20补充

终极状态
这类问题都有一个相同点,即数据有一个终极状态,对于893题来说,终极状态是所有奇数位置的物品在同一个位置上,所有偶数位置的物品在同一个位置上。当然了不用真的去实现这个状态,但是这就是终极状态,移动到这种状态是不需要花费任何代价的。
对于1217题来说,终极状态就是,对于每一个串,因为奇数位置可以互相交换任意次,偶数位置上的字符可以交换任意次,所以,终极状态就是,将一个串的奇数位置上的所有元素按照字典序排序、所有偶数位置上的字符元素按照字典序排序,若果有两个串如此操作之后,完全相同,则这两个串是符合题意的。
具体的操作,是将串str的奇数位置上的字符单独提取出来为odd串,偶数位置上的字符单独提取出来为even串,再使用sort()一个排序即可,而不必非得在原串至上进行奇数位置、偶数位置单独排序,这可能能够做到,但是绝对没有将奇数位置、偶数位置上的字符单独提取出来在排序之后再拼接比较来的思路清楚、快。
2021/1/28补充例题
力扣1460. Make Two Arrays Equal by Reversing Sub-arrays

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值